鍍金池/ 問答/Python/ windows下用Python進(jìn)行select套接字實(shí)驗(yàn)時(shí),返回的r_list問

windows下用Python進(jìn)行select套接字實(shí)驗(yàn)時(shí),返回的r_list問題。

window下利用select驗(yàn)證套接字讀寫,但是select返回的r_list文件描述符集似乎是不變的,代碼如下,求解答,謝謝

相關(guān)代碼

接收端:

import select,socket
sk=socket.socket()
sk.bind(("127.0.0.1",5002))
sk.listen(5)
inputs=[sk]
outputs=[]
while True:
    r_list,w_list,e_list=select.select(inputs,outputs,inputs,1)
    print(r_list)
    print("正在監(jiān)聽的端口數(shù):%d"%len(inputs))
    for sk_conn in r_list:
        if sk_conn==sk:
            conn,addr=sk.accept()
            conn.recv(1024)
            inputs.append(conn)
            print(inputs)
        else:
            try:
                rec=sk_conn.recv(1024)
            except Exception as ex:err
            else:
                print("收到:"+str(rec,encoding="utf-8")

發(fā)送端:

import socket
ck=socket.socket()
ck.connect(("127.0.0.1",5002))
ck.sendall(bytes("hello",encoding="utf-8"))
ck.close()

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

發(fā)送端sendall一次后關(guān)閉,接收端r_list應(yīng)該經(jīng)歷從0-1(sk)-2(sk,conn)-0,的過程,但是實(shí)際上r_list之后一直有1個(gè)文件描述符conn。
clipboard.png
這是為什么?

回答
編輯回答
巫婆

因?yàn)檫B接關(guān)閉之后,你沒有從 select.select() 的第一個(gè)參數(shù)中移除它。

一般而言,已斷開的 socket 在 select.select() 調(diào)用后,被移到 “可讀” 狀態(tài),而且調(diào)用 recv() 通常返回空串。

2018年1月17日 00:47