簡體   English   中英

如何通過UDP獲取send()以阻止?

[英]How can I get send() to block with UDP?

我正在編寫一個簡單的基於UDP的客戶端/服務器應用程序,並使用localhost上的客戶端/服務器進行測試,我希望發件人知道send()何時會被阻止。 我正在使用Python,所以我想我能做到:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(0)
s.connect(('127.0.0.1', 12345))
data = "x"
for i in range(0, 9000):  # More than about 9000 gives an error
    data += x
while True:
    try:
        s.send(data)
    except socket.error as e:
        print "Would have blocked"
        # Do something useful here

我想測試我的錯誤處理代碼是否有效,所以我想讓send()想要阻止。 問題是,我無法弄清楚如何做到這一點。 我試過了:

BUFFSIZE = 2000
input = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
input.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFSIZE)
input.bind(('127.0.0.1', 12345))
while True:
    data = input.recv(BUFFSIZE)
    time.sleep(100)

在睡眠100秒和設置一個小的接收緩沖區之間,我原本預計緩沖區已經填滿了。 但是,它永遠不會。 那么如何才能讓接收緩沖區填滿以便發送塊?

我正在使用Mac OS Lion和Macports版本的Python 2.6。

UDP通常不會阻止。 如果接收器具有完整緩沖區,則數據包將被靜默丟棄。 這是設計的。 如果您想要可靠的傳輸和阻塞語義,請改用TCP。

注釋: TCP阻塞的原因是因為發送方獲得了它發送的每個數據包的確認。 發件人只允許一定數量的“傳輸中”沒有確認的數據,並在達到此閾值時阻止。 由於UDP不發送接收數據包的確認,因此發送方無法知道何時阻止。 當然,它可能決定阻止它是否使其以太網端口飽和,但是使用UDP時無法判斷您的上行鏈路是否已飽和,接收器是否掛起,或者gremlins是否吃了您的數據包。 不保證!

暫無
暫無

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

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