- 论坛徽章:
- 0
|
我的应用概述如下:
系统有两块网卡,一块与内网相连,一块与外网相连。现在内网卡要做内网的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 error peration not supported;
这是为什么呢,是我socket建立的不对吗?哪位大侠能告诉我该怎样改才能达到我的目的?多谢了!!  |
|