我编写了一个 rawudp 程序,通过原始套接字发送 udp 数据包,按照网页http://www.tenouk.com/Module43a.html 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 地址不同也可以。
但是如果源ip地址和目的ip地址相同,udp服务器就无法接收udp数据包。
我尝试使用 tcpdump 来捕获 udp 数据包。我发现 tcpdump 可以显示 udp 数据包
当使用相同的源和目标 IP 地址时。
似乎当源和目标 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地址和目标IP地址设置为相同时,upd服务器可以从rawudp接收udp数据包。但是,如果我在与 udp 服务器不同的主机上运行 rawudp,当我将这些 IP 地址设置为相同时,udp 服务器无法从 rawudp 接收 upd 数据包。在这两种情况下,tcpdump 都可以在 udp 服务器端捕获 udp 数据包。
在后一种情况下,只有具有相同源和目标 IP 地址的 udp 数据包受到影响。如果我将它们设置不同,upd服务器总是可以接收udp数据包。我不确定如果没有从以下位置收到数据包,内核是否会丢弃具有相同本地 IP 地址的数据包lo
界面。