当前位置: 技术问答>linux和unix
怎样选择网卡进行socket编程?急,多谢了!!
来源: 互联网 发布时间:2015-05-25
本文导语: 我的应用概述如下: 系统有两块网卡,一块与内网相连,一块与外网相连。现在内网卡要做内网的http代理。我可以获得系统所有网卡的信息,包括硬件地址和ip地址等,存在一个元素为ifreq结构的数组buf中。intrfa...
我的应用概述如下:
系统有两块网卡,一块与内网相连,一块与外网相连。现在内网卡要做内网的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:%sn",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 error:operation not supported;
这是为什么呢,是我socket建立的不对吗?哪位大侠能告诉我该怎样改才能达到我的目的?多谢了!!
系统有两块网卡,一块与内网相连,一块与外网相连。现在内网卡要做内网的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:%sn",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 error:operation not supported;
这是为什么呢,是我socket建立的不对吗?哪位大侠能告诉我该怎样改才能达到我的目的?多谢了!!
|
要想选择某个网卡,在bind的时候指定其对应的ip就行了。
我看你程序中好像没有这一步。
我看你程序中好像没有这一步。
|
我的建议,既然你可以区分,你就写个配置文件好了,其它的我也不太清楚。至于你的程序出错,最好看看错误码