【问题标题】:Best practice for ethernet communication using socket使用套接字进行以太网通信的最佳实践
【发布时间】:2015-12-11 10:21:17
【问题描述】:

关于使用套接字与远程硬件通信时的最佳实践,我有一个相当普遍的问题:应该在发送每条消息后关闭套接字还是保持打开状态?

为了说明这个问题:我正在使用 python(和套接字)与远程硬件接口。通常,我会每 30 秒左右向设备发送一个命令,收到回复,然后等待约 30 秒。

目前我在做:

    # Open socket
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.settimeout(10)
    self.sock.connect((self.host_ip_address, self.port))

    # Send Message
    self.sock.send(my_command)

    # Receive Reply
    data = self.sock.recv(1024)

    # Close socket
    self.sock.shutdown(socket.SHUT_RDWR)
    self.sock.close()

我想知道这是否可取,或者我是否应该在我与设备的会话期间(比如约 1 小时)让套接字保持打开状态。这会很强大吗?

欢迎任何提示/指点谢谢!

【问题讨论】:

    标签: python sockets networking ethernet


    【解决方案1】:

    只要您不时通过套接字交换数据,这就是强大的。如果没有,防火墙/NAT 可以确定 TCP 连接中断并停止路由 TCP 数据包。

    【讨论】:

    • 感谢您的回复 - 您的意思是让套接字保持打开状态是稳健的,还是在通信之间关闭和重新启动是稳健的?
    • 让套接字打开是稳健的,只要您每 X 秒使用一次(假设 X
    • 另外,如果您使用开放连接,最好在打开套接字时设置“保持活动状态”标志。见tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.htmldelog.wordpress.com/2013/08/16/handling-tcp-keepalive
    • 谢谢。为了澄清,我如何“真正关闭它而不是让它漂浮”。我认为 self.sock.shutdown(socket.SHUT_RDWR) 然后 self.sock.close() 会这样做。我还有什么需要做的吗?
    • 是的,它会做到的。我在考虑你的程序流程。如果您的套接字不是本地的,请确保在所有情况下都执行此调用。
    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多