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]
,认为链接中断。
- client端为什么会在
shutdown(SHUT_WR)
(关闭读)后等待120s后抛出异常? - 如何控制这个超时时间?
代码:
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
同样的程序,mac未抛出异常,正常执行3分钟收到数据
https://docs.python.org/2.7/l...
看看你客户端的timeout默认是None么,可能版本不同
python 2.7.10