簡體   English   中英

通過斷開的管道發送數據

[英]Sending data through broken pipe

當我將套接字連接到服務器套接字,並且服務器套接字在給定時間關閉時,在客戶端會出現BrokenPipeError 但不是下次我嘗試發送郵件,而是之后的時間。

這里是一個SSCCE:

服務器:

#! /usr/bin/python3

import socket

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind ( ('', 10100) )
s.listen (1)
print ('Waiting on client')
client, _ = s.accept ()
print ('Accepted')
data = b''
done = False
while not done:
    data += client.recv (4096)
    msgs = data.split (b'\r')
    for msg in msgs [:-1]:
        print ('received {}'.format (msg) )
        done = msg == b'exit'
    data = msgs [-1]
s.close ()
print ('Server down')

客戶:

#! /usr/bin/python3

import socket

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
print ('Connecting')
s.connect ( ('localhost', 10100) )
print ('Connected')
for msg in [b'ping', b'pang', b'exit', b'ping', b'pang']:
    print ('Sending {}'.format (msg) )
    sent = s.send (msg + b'\r')
    print ('Sent {}. {} bytes transmitted'.format (msg, sent) )
    input ('>> ')

我啟動服務器,然后啟動客戶端,然后按Enter鍵以逐步瀏覽消息。

服務器輸出為:

Waiting on client
Accepted
received b'ping'
received b'pang'
received b'exit'
Server down

客戶端輸出為:

Connecting
Connected
Sending b'ping'
Sent b'ping'. 5 bytes transmitted
>> 
Sending b'pang'
Sent b'pang'. 5 bytes transmitted
>> 
Sending b'exit'
Sent b'exit'. 5 bytes transmitted
>> 
Sending b'ping'
Sent b'ping'. 5 bytes transmitted
>> 
Sending b'pang'
Traceback (most recent call last):
  File "./client.py", line 10, in <module>
    sent = s.send (msg + b'\r')
BrokenPipeError: [Errno 32] Broken pipe

為什么我得到BrokenPipeError最后后pang ,而不是后ping

為什么send發送回時,5 pingexit

服務器關閉后,為什么管道沒有立即斷開?


編輯:發送exit ,除非服務器控制台已經將Server down打印Server down否則我不會在客戶端控制台上按Enter鍵。

發送功能僅確保數據已傳輸到套接字緩沖區。 當服務器關閉時,它將發送FIN,ACK數據包,客戶端僅向其回復ACK。 直到客戶端也調用close方法本身,客戶端的套接字才會關閉。 然后,連接為“半開放”。

當客戶端再次向關閉的服務器套接字發送數據時,服務器將以RST響應,客戶端應終止與該RST的連接。 有關半開連接和其他異常的信息,請參見http://tools.ietf.org/search/rfc793#page-33 但是,在send方法返回后,套接字將關閉。 這就是為什么只有下一次發送會在BrokenPipe上崩潰的原因,因為連接現在也已從客戶端關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM