账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    python socket半关闭状态后抛出[Errno 10060]异常
    42
    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()
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部