鍍金池/ 問答/Java  Python  C++/ python socket半關(guān)閉狀態(tài)后拋出[Errno 10060]異常

python socket半關(guān)閉狀態(tài)后拋出[Errno 10060]異常

背景:利用socket完成一個(gè)echo服務(wù)
邏輯:

  • client端發(fā)送用戶輸入data后,調(diào)用shutdown(SHUT_WR)實(shí)現(xiàn)半關(guān)閉狀態(tài)
  • server端接收用戶發(fā)送的data,通過半關(guān)閉來判斷“消息接收”是否結(jié)束
  • 等待180s后將data返回給client

我有意將buffer size設(shè)置為8,讓server端通過判斷半關(guān)閉狀態(tài)來完成消息的接收。

問題:client端在調(diào)用shutdown(SHUT_WR)后,120s內(nèi)如果沒有收到server端返回的信息,它就會(huì)拋出異常[Errno 10060],認(rèn)為鏈接中斷。

  1. client端為什么會(huì)在shutdown(SHUT_WR)(關(guān)閉讀)后等待120s后拋出異常?
  2. 如何控制這個(gè)超時(shí)時(shí)間?

代碼:

  • 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()
回答
編輯回答
晚風(fēng)眠

同樣的程序,mac未拋出異常,正常執(zhí)行3分鐘收到數(shù)據(jù)
https://docs.python.org/2.7/l...
看看你客戶端的timeout默認(rèn)是None么,可能版本不同
python 2.7.10

2018年2月14日 23:45