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

背景:利用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()
阅读 4.4k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题