python 套接字 : make sure that TCP packets are send before closing connection

标签 python tcp robotics raw-sockets

我正在使用通过 TCP 控制的中继。据我了解,以下代码应该有效:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.200', 17494))
s.send(chr(101))
s.close()

但是,我注意到套接字在实际发送包之前关闭了,并且中继没有做任何事情。作为肮脏的解决方案,我现在在关闭连接之前放置了一个 sleep 语句并且它可以正常工作。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.200', 17494))
s.send(chr(101))
time.sleep(0.01)
s.close()

有没有什么更聪明的方法可以确保在关闭连接之前实际发送包?

最佳答案

您可以使用 s.setsockopt 设置 SO_LINGER 选项。 linger 选项使套接字等待(内部)并仅在发送所有未决数据达到指定的超时值后才关闭。像这样的东西:

linger_enabled = 1
linger_time = 10 #This is in seconds.
linger_struct = struct.pack('ii', linger_enabled, linger_time)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, linger_struct)

关于 python 套接字 : make sure that TCP packets are send before closing connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18871504/

相关文章:

networking - 如何知道何时完成接收 TCP 流?

c++ - 物体到相机的距离,使用opencv

java - 将文件格式与我的程序关联(Java)

real-time - 什么是类人机器人正确的RTOS?

python - 如何使用 Python 打开和处理存储在 Google Cloud Storage 中的 CSV 文件

Python:使用 HDF5 格式的不完整成对相异矩阵运行多维缩放

python - 如何在 Visual Studio 2013 上安装 Python 的 Mysql 包

python - 如何使用 python 列表有效地重命名数据帧索引?

c# - 有效且高效地管理许多 TCP 连接

c# - 针对 .NET 生产服务中的内存泄漏