python socket半关闭状态后抛出[Errno 10060]异常

发布于 2022-09-06 11:47:41 字数 1695 浏览 20 评论 0

背景:利用socket完成一个echo服务
逻辑:

  • client端发送用户输入data后,调用shutdown(SHUT_WR)实现半关闭状态
  • server端接收用户发送的data,通过半关闭来判断“消息接收”是否结束
  • 等待180s后将data返回给client

我有意将buffer size设置为8,让server端通过判断半关闭状态来完成消息的接收。

问题:client端在调用shutdown(SHUT_WR)后,120s内如果没有收到server端返回的信息,它就会抛出异常[Errno 10060],认为链接中断。

  1. client端为什么会在shutdown(SHUT_WR)(关闭读)后等待120s后抛出异常?
  2. 如何控制这个超时时间?

代码:

  • Server:
from socket import *

import time

HOST = ''
PORT = 21567
BUFSIZ = 8
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)


while True:
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print 'connected from:', addr

    data = ""
    while True:
        recv_data = tcpCliSock.recv(BUFSIZ)
        if not recv_data:
            break
        data += recv_data

    time.sleep(60 * 3)
    print 'send data:%s' % data
    tcpCliSock.send(data)

    print 'close connection:', addr
    tcpCliSock.close()
  • Client:
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 8
ADDR = (HOST, PORT)


tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

data = raw_input('>')
tcpCliSock.send(data)

tcpCliSock.shutdown(SHUT_WR)

data = ""
while True:
    try:
        recv_data = tcpCliSock.recv(BUFSIZ)
        if not recv_data:
            break
        data += recv_data
    except Exception as e:
        print e
        break;


print data
tcpCliSock.close()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼角的笑意。 2022-09-13 11:47:41

同样的程序,mac未抛出异常,正常执行3分钟收到数据
https://docs.python.org/2.7/l...
看看你客户端的timeout默认是None么,可能版本不同
python 2.7.10

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文