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

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 11435 | 回復(fù): 7
打印 上一主題 下一主題

socket broken pipe [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-06-01 19:59 |只看該作者 |倒序?yàn)g覽
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ā)送一段數(shù)據(jù),然后close

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

也是運(yùn)行時(shí)的輸出是:
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的時(shí)候就出現(xiàn)broken pipe?

多謝

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-06-02 03:24 |只看該作者
沒看到你client的代碼,不好解釋
tcp是半關(guān)閉的,有可能是當(dāng)你send的時(shí)候,client只是關(guān)閉
了自己的發(fā)送,而還可以接收,你把time.sleep(1)放到send前面
看看是第幾次發(fā)生broken pipe的

以上為鄙人拙見,僅供參考

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-06-02 08:02 |只看該作者

回復(fù) #2 wudagang0123 的帖子

同理,再帖部分client代碼上來瞅瞅

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-06-02 11:52 |只看該作者
寫已經(jīng)關(guān)閉的socket會得到SIGPIPE,也就是broken pipe.
當(dāng)然應(yīng)該在第二次寫的時(shí)候才會有SIGPIPE了,第一次寫會得到一個(gè)RST,通知你socket已經(jīng)不可用了,再寫的話就是SIGPIPE了。
如果你第一次寫就broken pipe,那才奇怪呢

建議你看看UNP,這個(gè)問題與python無關(guān),和client無關(guān),tcp就是這么規(guī)定的,c的實(shí)現(xiàn)也是這樣的.

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-06-02 18:06 |只看該作者
但從運(yùn)行的結(jié)果來看,第一次寫是成功了,也并沒有發(fā)生rst啊

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-06-04 21:52 |只看該作者
這個(gè)....
不好意思,開始沒看輸出
如果是RST,返回值應(yīng)該是負(fù)的吧?
要不你把兩邊的代碼發(fā)上來,我來調(diào)調(diào)

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 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)


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

[ 本帖最后由 tianqio 于 2009-6-9 15:43 編輯 ]

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2009-06-09 17:09 |只看該作者
server監(jiān)聽5000端口
當(dāng)client調(diào)用close,但server沒有發(fā)送數(shù)據(jù)前,二者的狀態(tài)如下:

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


當(dāng)socket處于close_wait狀態(tài)時(shí),如果發(fā)送的不是FIN,ACK 包,對端會是什么響應(yīng)?
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP