多线程中的recvfrom函数问题: 子线程会收到整个进程接收的报文
多线程部分的逻辑是这样的:
我开了4个线程:
线程A: 1. 创建socket sockA, 2. bind 到设备的ip上,开始死循环(3. 用sendto向目的ip ip_a发icmp请求报文,4. 用recvfrom接受收到的报文)。(ip_a是我电脑的ip,抓包用)
线程B: 1. 创建socket sockB, 2. bind 到设备的ip上,开始死循环(3. 用sendto向目的ip ip_b发icmp请求报文,4. 用recvfrom接受收到的报文)。(ip_b是一个ping不通的ip)
线程C: 1. 创建socket sockC, 2. bind 到设备的ip上,开始死循环(3. 用sendto向目的ip ip_c发icmp请求报文,4. 用recvfrom接受收到的报文)。(ip_c能通)
线程D: 1. 创建socket sockD, 2. bind 到设备的ip上,开始死循环(3. 用sendto向目的ip ip_d发icmp请求报文,4. 用recvfrom接受收到的报文)。(ip_d能通)
这几个线程,都是调用的同一函数: void *func(){(逻辑1)、(逻辑2)、(逻辑3)、(逻辑4)}
执行结果:
1. 在电脑上通过wireshark能抓到报文,dip、sip、个数(有多少个请求的就有多少个应答的)、长度都正确。(注意:wireshark没抓到其他线程需要的应答报文,但是通过程序解析recvfrom函数的第二个参数和打印查看第5个参数(struct sockaddr *)&from,发现还收到了源IP为ip_c、ip_d的报文);
2. 线程B能收到报文,程序里解析报文内容并打印出来一看,发现,收到的报文的源ip有ip_a、ip_c、ip_d的。
3. 线程C能收到报文,除了ip_c,还有ip_a、ip_d的
4. 线程D能收到报文,除了ip_d,还有ip_a、ip_c的
分析:
1. 从执行结果1来看,程序发包部分,应该没问题,wireshark没有出现线程A 发ip_b\ip_c\ip_d的icmp请求包和收到ip_b\ip_c\ip_d的icmp应答包。
2. 从程序打印信息来看,每个线程调用recvfrom函数能收到的整个进程收到的应答报文,没有达到“a线程只收ip_a的icmp应答报文,b线程…………”的效果。
因此,在这里请教各位大侠,出现“子线程recvfrom了整个进程收到的包”是什么原因呢?该如何解决。