【问题标题】:socket programming with python on linux - s.connect() time-out在 Linux 上使用 python 进行套接字编程 - s.connect() 超时
【发布时间】:2023-04-11 05:47:01
【问题描述】:

我正在使用 TCP 套接字连接到某个网页,因为它将在循环中运行,尝试创建套接字、连接、发送数据,然后接收然后关闭套接字。问题是 s.connect() 在随机迭代和特定网站上超时。我读到了 TCP time_wait 所以

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

添加时没有运气。然后在每次迭代后睡眠一秒钟,但仍然没有运气。 我应该注意到它在另一个较慢的网络中运行良好,但在我试图运行代码的快速网络中却不行。 我认为以下伪代码可以更清楚地说明:

while(1)
{time.sleep(1)
s = socket.socket() #TCP socket creation
s.settimeout(2) # 2 seconds for time-out which is more than needed
s.connect()
s.send(message) #which is a HTTP get request
s.recv() # which is a HTTP response
s.close()}

我的代码例程遵循这些步骤,每个套接字方法都正确实现,但我在连接时遇到超时。我确信服务器运行正常。我怀疑它可能与 TCP time_wait 有关,但 cmets 似乎不同意

【问题讨论】:

    标签: python linux sockets


    【解决方案1】:

    如果与服务器的 TCP 握手未在特定时间内完成,则连接超时,通常是因为服务器没有及时响应。可能有多种原因,例如服务器停机、在 DNS 查找期间为服务器获取错误的 IP 地址、服务器过载等。

    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    在连接的客户端添加这个没有用。

    如果问题是由崩溃的服务器引起的,在服务器端添加它会有所帮助,因为它允许服务器再次绑定到侦听器地址而无需等待,因此服务器可以更快地再次可用。但是,我不知道这是否真的是您面临的问题。

    【讨论】:

    • 感谢您对 REUSEADDR 的澄清。问题不是您提到的问题,因为它发生在我尝试像前面提到的那样在循环中连接时,输出类似于:超时,RTT = 8 ms 成功,RTT = 7ms 成功,时间-出
    • @HamedTemsah 您是否设置了任何明确的连接超时?您是否在重新连接之间干净地关闭了连接?
    • @HamedTemsah:你怎么知道这不是服务器宕机和服务器过载?你对服务器有控制权吗?而且,您是否可以设置一个非常短的连接超时?
    • tnx smassey 和 steffen,我编辑了 Q,也许它更清楚了。
    • @HamedTemsah:我看到你的超时时间只有 2 次。在这种情况下,我假设服务器只是很忙,不会反应那么快。如果其他东西在同一台机器上运行并占用 CPU 时间或内存等资源,也会发生这种情况。当然,服务器上可能还安装了速率限制。
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多