【发布时间】:2018-07-09 12:18:19
【问题描述】:
客户:
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
msg = b"X"
for i in range(1500):
s.sendto(msg,("<IP>",<PORT>))
服务器:
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(("",>PORT>))
counter = 0
for i in range(1500):
s.recv(1)
counter += 1
我有两台机器 - 第一台使用 Windows7,第二台使用 Ubuntu 16.04。
现在的问题:
如果我尝试从客户端向服务器发送 1500 个 UDP 数据包(例如),那么:
Windows7 是客户端,Ubuntu16.04 是服务器: 服务器只接收 200 到 280 个数据包
Ubuntu16.04 是客户端,Windows7 是服务器: 服务器接收所有 1500 个数据包
我的第一个问题:
这是什么原因?操作系统有什么限制吗?
第二个问题:
是否可以在 Python 中优化套接字?
我知道 UDP 包可能会丢失 - 但最多丢失所有数据包的 4/5?
编辑: 为什么会有这样的问题? 想象一下,我有一个大型传感器网络……和一台服务器。每个传感器节点都应该将他的信息发送到服务器。服务器上的程序只能以异步方式进行编程——服务器只能在特定时间从套接字中读取数据。现在我想计算在服务器无法读取其缓冲区的时间段内,有多少传感器节点可以通过 UDP 数据包向服务器发送数据。有了缓冲区中可以存储多少个不同的 UDP 数据包的信息,我可以计算出可以使用多少个传感器节点...
【问题讨论】:
-
如果我错了,请纠正我,但您每 1500 次迭代只接收 1 个字节?
-
我的第一个猜测是windows防火墙设置,你检查过你尝试使用的端口是否打开了吗?
-
@Torxed:是的.. 但是消息应该是 200-250 字节长。现在我尝试了其他一些消息长度,并且收到的数据包更少。我如何才能确定缓冲区中可以存储多少个特定大小的不同数据包? :/ 为什么在操作系统上有一些差异?
-
@meissner:windows机器上接收数据包没有问题吗?但是我尝试将发送套接字绑定到特定端口并在 Windows 防火墙中打开该端口 - 结果相同,在 Ubuntu 机器上只收到 5 个数据包中的 1 个......我已经用 wireshark 检查了这个,并且wireshark告诉我windows-machine已经发送了1500个udp-packets..
标签: python windows udp ubuntu-16.04 python-sockets