Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 错误的UDP校验和没有影响:为什么?_Python_Python 3.x_Sockets_Udp_Python Asyncio - Fatal编程技术网

Python 错误的UDP校验和没有影响:为什么?

Python 错误的UDP校验和没有影响:为什么?,python,python-3.x,sockets,udp,python-asyncio,Python,Python 3.x,Sockets,Udp,Python Asyncio,我试图测试一个UDP程序,如果它接收到的数据具有错误的UDP校验和,会发生什么情况。奇怪的是,它似乎没有任何效果,有效负载被成功接收,至少在OSX上是通过环回接口接收的 下面是一个示例,其中使用SOCK_RAW+IPPROTO_UDP发送数据,手动将校验和指定为不正确的内容,并使用SOCK_DGRAM接收数据 导入异步IO 导入套接字 导入结构 异步def服务器(): 与\ 插座( socket.AF_INET,socket.SOCK_DGRAM )作为袜子: 袜子锁定(错误) 袜子捆扎(“”,

我试图测试一个UDP程序,如果它接收到的数据具有错误的UDP校验和,会发生什么情况。奇怪的是,它似乎没有任何效果,有效负载被成功接收,至少在OSX上是通过环回接口接收的

下面是一个示例,其中使用
SOCK_RAW
+
IPPROTO_UDP
发送数据,手动将校验和指定为不正确的内容,并使用
SOCK_DGRAM
接收数据

导入异步IO
导入套接字
导入结构
异步def服务器():
与\
插座(
socket.AF_INET,socket.SOCK_DGRAM
)作为袜子:
袜子锁定(错误)
袜子捆扎(“”,4567))
有效载荷=等待循环。sock_recv(sock,512)
打印(有效负载)#打印b'somedata'
异步def main():
asyncio.确保未来(服务器())
等待异步IO.sleep(0)
带插座(
family=socket.AF\u INET,type=socket.SOCK\u RAW,proto=socket.IPPROTO\u UDP,
)作为袜子:
本地_ip='127.0.0.1'
src_端口=4566
目的港=4567
有效载荷=b'somedata'
长度=8+长度(有效载荷)
校验和=3#3不是正确的校验和
header\u bad\u checksum=结构包(“!4H”,src\u端口,dest\u端口,长度,校验和)
发送到(标头错误校验和+有效负载,(本地ip,4567))
等待asyncio.sleep(1)
loop=asyncio.get\u event\u loop()
循环。运行\u直到完成(main())
loop.close()
为什么会这样?我本以为有效载荷会被忽略


此UDP消息的Wireshark转储如下所示,显示(在本例中)校验和为3


据我所知,
sendto()
只发送字节;它不关心校验和验证。你有没有一个文档链接不是这样写的?@JohnGordon好吧,没有。但是,我希望接收端进行验证,而不是发送,因为我认为校验和的目的是捕获传输过程中引入的错误。您是否检查了您收到的校验和传输的校验和是否相同?这可能是由校验和卸载引起的。您的NIC可能正以正确的方式覆盖校验和计算。@HugoSadok我现在包含了Wireshark的一个屏幕截图,我认为它是相同的。@HugoSadok经过一些初始测试后,从我网络上的另一台计算机接收到校验和错误的UDP数据包,根据Wireshark,但是Python中的套接字似乎没有接收它们。因此,这确实表明macOS在环回接口中忽略了它们。这有点烦人,因为我希望使用环回接口作为测试的“真实”接口,但它在这方面的行为似乎有所不同。