亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: socket broken pipe [打印本頁]

作者: tianqio    時間: 2009-06-01 19:59
標題: socket broken pipe
server端的代碼如下:
while True:
    sock,address = server_socket.accept()
    data = sock.recv(bufsize)
    while data != '':
        data = sock.recv(bufsize)
    print 'sock closed by peer'
    string = 'nihao,client'
    a = 0
    while True:
        a += sock.send(string)
        time.sleep(1)
        print a
    print 'write finish: %d' % a


客戶端的代碼就是連接,然后發(fā)送一段數據,然后close

問題是: 服務端在recv的時候通過while  data != '' 來控制一直讀直到socket被客戶端關閉,然后進行寫,按照常理在第一次寫的時候就應該出現broken pipe的錯誤,但實際運行時實在第二次寫的時候才引發(fā)該錯誤

也是運行時的輸出是:
sock closed by peer
12
Traceback (most recent call last):
  File "./server.py", line 25, in ?
    a += sock.send(string)
socket.error: (32, 'Broken pipe')

為什么不是第一次send的時候就出現broken pipe?

多謝
作者: wudagang0123    時間: 2009-06-02 03:24
沒看到你client的代碼,不好解釋
tcp是半關閉的,有可能是當你send的時候,client只是關閉
了自己的發(fā)送,而還可以接收,你把time.sleep(1)放到send前面
看看是第幾次發(fā)生broken pipe的

以上為鄙人拙見,僅供參考
作者: xiaoyu9805119    時間: 2009-06-02 08:02
標題: 回復 #2 wudagang0123 的帖子
同理,再帖部分client代碼上來瞅瞅
作者: chrisyan    時間: 2009-06-02 11:52
寫已經關閉的socket會得到SIGPIPE,也就是broken pipe.
當然應該在第二次寫的時候才會有SIGPIPE了,第一次寫會得到一個RST,通知你socket已經不可用了,再寫的話就是SIGPIPE了。
如果你第一次寫就broken pipe,那才奇怪呢

建議你看看UNP,這個問題與python無關,和client無關,tcp就是這么規(guī)定的,c的實現也是這樣的.
作者: tianqio    時間: 2009-06-02 18:06
但從運行的結果來看,第一次寫是成功了,也并沒有發(fā)生rst啊
作者: chrisyan    時間: 2009-06-04 21:52
這個....
不好意思,開始沒看輸出
如果是RST,返回值應該是負的吧?
要不你把兩邊的代碼發(fā)上來,我來調調
作者: tianqio    時間: 2009-06-09 15:41
server.py
import socket,time
port = 5000

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind(("", port))
server_socket.listen(5)

bufsize = 4096
while True:
    print 'accept'
    sock,address = server_socket.accept()
    data = sock.recv(bufsize)
    while data != '':
        print data
        print 'r'
        data = sock.recv(bufsize)
        print 'e:data:%s' % data
    print 'sock closed by peer'
    print 'write'
    a = 0
    string = 'nihao,client'
    while True:
        a += sock.send(string)
        print 'write finish: %d' % a


client.py
import socket,sys,time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost',int(sys.argv[1])))
client_socket.send(sys.argv[2])

#client_socket.shutdown(2)
client_socket.close()
time.sleep(1000)


客戶端必須是先調用close,所以無法從客戶端來驗證server第一次寫是否是真正的寫成功,但是server send的返回值來看,確實是寫成功了的

[ 本帖最后由 tianqio 于 2009-6-9 15:43 編輯 ]
作者: tianqio    時間: 2009-06-09 17:09
server監(jiān)聽5000端口
當client調用close,但server沒有發(fā)送數據前,二者的狀態(tài)如下:

tcp        0      0 localhost.localdomain:43216 localhost.localdomain:5000  FIN_WAIT2   
tcp        0      0 localhost.localdomain:5000  localhost.localdomain:43216 CLOSE_WAIT


當socket處于close_wait狀態(tài)時,如果發(fā)送的不是FIN,ACK 包,對端會是什么響應?




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2