套接字的不解

套接字的不解

套接字的疑惑
找了两个原始套接字的发包程序,发现一个疑惑
一个是用:
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。

套接字的不解

相关文章:

你感兴趣的文章:

标签云: