免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3063 | 回复: 3
打印 上一主题 下一主题

怎样选择网卡进行socket编程,急,多谢了!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-22 08:29 |只看该作者 |倒序浏览
我的应用概述如下:
系统有两块网卡,一块与内网相连,一块与外网相连。现在内网卡要做内网的http代理。我可以获得系统所有网卡的信息,包括硬件地址和ip地址等,存在一个元素为ifreq结构的数组buf中。intrface为网卡的个数。现在想选择内网卡做http代理,代码如下:
struct sockaddr_sll sll;
fd1 = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_IP) );
if(ioctl(fd, SIOCGIFINDEX, (char *)&buf[intrface])){
printf("ioct error!";
exit(1);
}
memset( &sll, 0, sizeof(sll) );
sll.sll_family = AF_PACKET;
sll.sll_ifindex = buf[intrface].ifr_ifindex;
sll.sll_protocol = htons(ETH_P_IP);

if( bind(fd1, (struct sockaddr *) &sll, sizeof(sll)) == -1 ) {
printf("bind error:%s\n",strerror(errno));
return -1;
}
运行之后绑定是成功的。
然后我完善程序,在绑定之后对fd1进行监听,接受来自于fd1的数据包,代码如下:
listen(fd1,5);
printf("server is waiting!\n";
clientlen = sizeof(clientsock);
clientfd=accept(fd1,(struct sockaddr *)&clientsock,&clientlen))
程序执行到这里就报错:
accept errorperation not supported;
这是为什么呢,是我socket建立的不对吗?哪位大侠能告诉我该怎样改才能达到我的目的?多谢了!!

论坛徽章:
0
2 [报告]
发表于 2003-12-22 12:00 |只看该作者

怎样选择网卡进行socket编程,急,多谢了!!

你的思路有一点错误。前面的那段代码,你能够得到你机器上所有的ip地址,然后你应该选择一个ip地址,然后重新创建一个socket,用SOCK_STREAM类型的,然后做bind,listen,accept,这样就行了。

论坛徽章:
0
3 [报告]
发表于 2003-12-22 12:21 |只看该作者

怎样选择网卡进行socket编程,急,多谢了!!

楼上的那位大侠,我现在就是不知道该怎样选择ip地址来进行我接下来的工作啊,您能不能告诉我一下具体的方法呢,多谢了

论坛徽章:
0
4 [报告]
发表于 2003-12-22 13:30 |只看该作者

怎样选择网卡进行socket编程,急,多谢了!!

其实一般的做法没有这么复杂,你用ifconfig就能够得到所有的ip地址,然后把你需要做http代理的那块网卡ip地址写到您的配置文件里面,然后程序里面直接去绑定这个ip来listen,不就可以了?不明白你为什么要使用程序来获取ip地址?如果你的内网ip地址是dhcp得到的,那么简单的做法就是写一个脚本,在启动你的代理程序之前,通过ifconfig(你总归能够知道那块网卡是内网的)来得到这块网卡的ip,然后通过参数,或者用脚本去修改你的配置文件来启动你的程序。我觉得这种方法比较可取。至于如何从ifconfig中得到某块网卡的ip地址,去www.fangqiang.com里面有很好的解答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP