日期:2014-05-16  浏览次数:20699 次

套接字的疑惑
找了两个原始套接字的发包程序,发现一个疑惑
一个是用:
struct sockaddr sa;
sa.sa_family = PF_PACKET;
strcpy(sa.sa_data, "eth0");
sendto(...&sa,sizeof(sa));
另一个是用:
struct sockaddr_in peer_addr;
bzero(&peer_addr,sizeof(peer_addr));
peer_addr.sin_family = AF_INET;
peer_addr.sin_addr.s_addr = inet_addr("3.3.3.3");
sendto(...&peer_addr,sizeof(struct sockaddr));

两者有什么区别,sockaddr和sockaddr_in一样吗?
strcpy(sa.sa_data, "eth0");可以指定发送的接口
如果用sockaddr_in怎么指定发送的接口
------解决方案--------------------
sockaddr的尺寸和sockaddr_in一样,并且sockaddr是所有sockaddr_in/sockaddr_in6/sockaddr_un的基类, 大家都有sa_family字段,至于发包从哪个网卡出去,这是路由表决定的,你非得从一个根本没法到达目的地的(不是同网段或者没有默认网关)的网卡送出去一个包,是完全无聊的,所以你没必要限制网卡,在应用层来说就是没必要bind一个特定的本地IP。