用 setsockopt () 来绑定网口

Tom_殇子 2012-12-24 10:17:33
最近做一个项目要用到双网卡 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,
%s\n",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绑定了。也不知道我这个想法是不是对的…… 请老师们指点一下……


...全文
512 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nevil 2013-01-05
  • 打赏
  • 举报
回复
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。
引用 5 楼 tanghui20 的回复:
引用 2 楼 nevil 的回复:先用setsocketopet设置一下SO_REUSEADDR setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&if_ppp0,sizeof(if_ppp0)); 您好…… 可以讲一下为什么要这样做吗?
Tom_殇子 2013-01-05
  • 打赏
  • 举报
回复
大侠们…… 跪求解啊……
Tom_殇子 2013-01-04
  • 打赏
  • 举报
回复
引用 2 楼 nevil 的回复:
先用setsocketopet设置一下SO_REUSEADDR setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&if_ppp0,sizeof(if_ppp0));
您好…… 可以讲一下为什么要这样做吗?
Tom_殇子 2013-01-04
  • 打赏
  • 举报
回复
引用 3 楼 langeldep 的回复:
理论上绑定肯定是可以绑定的, 关键是你绑定的端口号不能重复。
您好…… 我这里绑定的是网口 啊…… 还没有使用bind 来绑定IP 和端口呢…… 但是在这里的时候 就已经出错 了,
langeldep 2013-01-02
  • 打赏
  • 举报
回复
理论上绑定肯定是可以绑定的, 关键是你绑定的端口号不能重复。
nevil 2012-12-27
  • 打赏
  • 举报
回复
先用setsocketopet设置一下SO_REUSEADDR setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&if_ppp0,sizeof(if_ppp0));
Tom_殇子 2012-12-27
  • 打赏
  • 举报
回复
那位高手帮帮忙忙啊……?

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧