UDP包由tcpdump的捕获,而不是由接收插座[关闭](udp packet caught by

2019-09-23 23:59发布

我写了一个rawudp程序通过原始套接字发送UDP数据包,网页下面http://www.tenouk.com/Module43a.html 。 然后,我写了一个UDP服务器监听指定端口的UDP数据包。 这些代码看起来如下:

...
sd = socket(AF_INET, SOCK_DGRAM, 0);
bind(sd, (struct sockaddr *)&ipaddr, sizeof(ipaddr));
size = recvfrom(sd, msgbuf.text, 2000, 0, (struct sockaddr *)&sin, &sin_len);
... // print the recevied udp packet

当我用rawudp的UDP数据包发送到UDP服务器,它是好的,如果源IP地址和目的IP地址是不同的。 而UDP服务器无法接收到UDP数据包,如果源IP地址和目的IP地址相同。

我试图使用tcpdump的捕捉UDP包。 而且我发现使用相同的源和目的IP地址时,tcpdump的可以显示的UDP数据包。 这似乎当源和目的IP地址都相同,某处的UDP包被丢弃,因此它不是在UDP服务器插口接收。

以下是一些日志(IP地址在日志更新)。 两种情况之间的唯一区别是源IP地址(192.168.0.26与192.168.0.226)。

我被卡在这个问题上。 是否有任何人能帮助我。 提前致谢。

UDP客户端侧(rawudp):

case 1> rawudp 192.168.0.26 18321 192.168.0.226 19702 test.bin # using different source and destination ip addresses
size of ip header:  20
size of udp header: 8
read 69 bytes from file test.bin successfully.
socket() - using SOCK_RAW socket and UDP protocol is OK.
setsockopt() is OK.
total length of IP packet: 97
    0000:  4500 6100 0000 4000 4011 CD8F C0A8 001A 
    0010:  C0A8 00E2 4791 4CF6 004D 0000 0104 0401 
    0020:  FF00 0105 084E 0600 5225 1183 0406 0501 
    0030:  5211 3840 0D05 2735 2109 02C0 0023 0101 
    0040:  8080 448D 30C0 0300 9005 093C 5E56 8791 
    0050:  4B2D B7C0 082A 0000 2900 0000 0412 0C95 
    0060:  00
sendto() is OK.

case 2> rawudp 192.168.0.226 18321 192.168.0.226 19702 test.bin # using same source and destination ip addresses
size of ip header:  20
size of udp header: 8
read 69 bytes from file test.bin successfully.
socket() - using SOCK_RAW socket and UDP protocol is OK.
setsockopt() is OK.
total length of IP packet: 97
    0000:  4500 6100 0000 4000 4011 CCC7 C0A8 00E2 
    0010:  C0A8 00E2 4791 4CF6 004D 0000 0104 0401 
    0020:  FF00 0105 084E 0600 5225 1183 0406 0501 
    0030:  5211 3840 0D05 2735 2109 02C0 0023 0101 
    0040:  8080 448D 30C0 0300 9005 093C 5E56 8791 
    0050:  4B2D B7C0 082A 0000 2900 0000 0412 0C95 
    0060:  00
sendto() is OK.

UDP服务器端:

case 1>
udp server receive 69 bytes from ip address 192.168.0.26 port 18321, sin_len 16
02:13:24.252841 IP 192.168.0.26.18321 > 192.168.0.226.19702: UDP, length 69
    0x0000:  4500 0061 0000 4000 4011 0198 c0a8 001a  E..a..@.@.......
    0x0010:  c0a8 00e2 4791 4cf6 004d 0000 0104 0401  ....G.L..M......
    0x0020:  ff00 0105 084e 0600 5225 1183 0406 0501  .....N..R%......
    0x0030:  5211 3840 0d05 2735 2109 02c0 0023 0101  R.8@..'5!....#..
    0x0040:  8080 448d 30c0 0300 9005 093c 5e56 8791  ..D.0......<^V..
    0x0050:  4b2d b7c0 082a 0000 2900 0000 0412 0c95  K-...*..).......
    0x0060:  00
                              .
02:13:39.500469 IP 192.168.0.226.18321 > 192.168.0.226.19702: UDP, length 69
    0x0000:  4500 0061 0000 4000 4011 00d0 c0a8 00e2  E..a..@.@.......
    0x0010:  c0a8 00e2 4791 4cf6 004d 0000 0104 0401  ....G.L..M......
    0x0020:  ff00 0105 084e 0600 5225 1183 0406 0501  .....N..R%......
    0x0030:  5211 3840 0d05 2735 2109 02c0 0023 0101  R.8@..'5!....#..
    0x0040:  8080 448d 30c0 0300 9005 093c 5e56 8791  ..D.0......<^V..
    0x0050:  4b2d b7c0 082a 0000 2900 0000 0412 0c95  K-...*..).......
    0x0060:  00        

当我运行rawudp和同一台主机上UDP服务器,当我设置的源和目的IP地址相同的UPD服务器可能收到来自rawudp UDP包。 但是,如果我在不同的主机比UDP服务器上运行rawudp,UDP服务器无法从rawudp收到UPD分组当我设置的IP地址相同。 在这两种情况下,tcpdump的可以赶在UDP服务器端的UDP数据包。

在后一种情况下,仅具有相同的源和目的地IP地址的UDP包的影响。 如果我将它们不同,UPD的服务器总是可以接收UDP数据包。 我不知道,如果包没有收到来自内核可以用同一个IP地址的数据包丢弃lo接口。

文章来源: udp packet caught by tcpdump, but not received by socket [closed]