当前位置:  技术问答>linux和unix

用 setsockopt () 来绑定网口

    来源: 互联网  发布时间:2017-03-28

    本文导语:  最近做一个项目要用到双网卡 ppp0  , ppp1  都是用的无线拨的号。所以在代码中要能同时使用只得绑定网口了,很自然就要用到: sockfd = socket(AF_INET, SOCK_STREAM, 0);(TCP) int out = setsockopt(sockfd,SOL_SOCKET,SO_BINDTODEVI...

最近做一个项目要用到双网卡 ppp0  , ppp1  都是用的无线拨的号。所以在代码中要能同时使用只得绑定网口了,很自然就要用到:
sockfd = socket(AF_INET, SOCK_STREAM, 0);(TCP)
int out = setsockopt(sockfd,SOL_SOCKET,SO_BINDTODEVICE,(char *)&if_ppp0,sizeof(if_ppp0));
if(out!=0)
{
error("setsockopt n");
printf("*** bindif(%s)  failed ! errno is %d,
                       %sn",ppp0,errno,strerror(errno));
exit(1);
}
在这个网页可以找到使用的方法:
http://www.linuxidc.com/Linux/2011-02/32226.htm
可以看到我这里绑定的是ppp0 , 用的是TCP协议。
但是一个程序不可能只用到TCP 啊! 还得用到UDP , 所以我用同样的方法创建一个UDP的套接口,也一样的绑定了。
结果:编译的时候没有出错,但是在运行的时候在UDP套接口绑定的时候报错:
*** bindif(ppp0)        failed ! errno is 19, No such device(就是上面的绑定失败后的内容)

所以我有个想法: 一个网口是不是只能用下个协议去绑定呢?比如说:ppp0用了TCP绑定了,就不能用UDP绑定了。也不知道我这个想法是不是对的……  请老师们指点一下……



|
先用setsocketopet设置一下SO_REUSEADDR
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&if_ppp0,sizeof(if_ppp0));

|
SO_REUSEADDR可以用在以下四种情况下。
(摘自《Unix网络编程》卷一,即UNPv1)
1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。
3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。 



|
理论上绑定肯定是可以绑定的, 关键是你绑定的端口号不能重复。 

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 为什么我的setsockopt()总提示setsockopt: No such device
  • 问一个关于调用setsockopt函数设置tos值的问题
  • setsockopt出错
  • 关于igmp的setsockopt
  • setsockopt()函数的问题
  • [求助]请教各位一个关于setsockopt的问题!
  • setsockopt问题
  • 为什么setsockopt没有用?
  • 请问大家setsockopt()里面optval的作用到底什什么
  • 使用原始套接字来发送一个icmp包,不适用setsockopt做控制会怎么样?
  • setsockopt(),该函数的一个用法。
  • .net/c#/asp.net iis7站长之家
  • 怎样解决"Cannot set Socket Options for Trasnmit Socket" error 当使用setsockopt() 在solaris 5.8
  • err=sock->ops->setsockopt(sock, SOL_SOCKET, ...);返回值代表的含义?
  • setsockopt的参数optname的意义?
  • setsockopt设置了linger选项的疑问
  • linux setsockopt 没有IPPROTO_TCP吗?(100)
  • 请问: setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL)); 中的,(const char*)&bDontLinger是什么意思啊
  • 请教关于setsockopt(来者有分)
  • setsockopt延时的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,