簡體   English   中英

boost :: asio async_read_some示例代碼無法讀取套接字中的所有數據

[英]boost::asio async_read_some example code not reading all data in the socket

我使用的是TCP回顯示例(Ubuntu主軟件包中當前提供的是1.62)。

https://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp

它適用於小事情,您可以看到它具有1024的緩沖區並使用async_read_some

但是,然后我嘗試向其發送Python字符串("A"*4096)+("B"*4096)+("C"*4096) ...我將看到4個對讀取處理程序的調用,每個調用為1024位。 ..即它將打印所有的As,但不會打印任何B或C。

預期的行為:如果套接字中有4096 * 3個數據,則隨后對async_read_some調用應一次將所有數據拉出1024個?

在這樣的回聲協議中,不能使用async_read ,因為可變數據是通過電線傳遞的。 問題是async_read_some被忽略/刪除了仍要從套接字讀取的數據。

如何修復示例代碼?

我獲取了該示例,並使用了您所謂的客戶代碼:

#!/usr/bin/env python
import socket

TCP_IP = '127.0.0.1'
TCP_PORT = 6767
BUFFER_SIZE = 1024
MESSAGE = ("A"*4096)+("B"*4096)+("C"*4096);

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)

received = "";
while (len(received) < len(MESSAGE)):
    data = s.recv(BUFFER_SIZE)
    print "received data: %d bytes ending in ...%s" % (len(data), data[-10:])
    received += data

s.close()

它可以正確運行並打印

 sehe  ~  Projects  stackoverflow  ./sotest 6767&
 sehe  ~  Projects  stackoverflow  python ./test.py
received data: 1024 bytes ending in ...AAAAAAAAAA
received data: 1024 bytes ending in ...AAAAAAAAAA
received data: 1024 bytes ending in ...AAAAAAAAAA
received data: 1024 bytes ending in ...AAAAAAAAAA
received data: 1024 bytes ending in ...BBBBBBBBBB
received data: 1024 bytes ending in ...BBBBBBBBBB
received data: 1024 bytes ending in ...BBBBBBBBBB
received data: 1024 bytes ending in ...BBBBBBBBBB
received data: 1024 bytes ending in ...CCCCCCCCCC
received data: 1024 bytes ending in ...CCCCCCCCCC
received data: 1024 bytes ending in ...CCCCCCCCCC
received data: 1024 bytes ending in ...CCCCCCCCCC

所以你做錯了。

預期的行為:如果套接字中有4096 * 3個數據,則隨后對async_read_some的調用應一次將所有數據拉出1024個?

是。 這正是發生的情況。 提醒您,您不應該假定1024個塊中的塊“到達”。 根據中間OS /網絡層中的緩沖,它們可能碰巧以較小的塊到達。 IOW:TCP是流協議,數據包是您通常不應該依賴的實現細節¹

在這樣的回聲協議中,不能使用async_read,因為可變數據是通過電線傳遞的。

數據總是可變的(否則將沒有理由發送數據)。 總是可以在可以read使用async_read ,因為它只是同一功能的異步IO版本。


¹使用各種先進的技術/標記,您可以在某種程度上控制這些效果,但是它們部分取決於平台,並且幾乎總是以一定的余量運行,從而為OS /網絡層留出了優化網絡性能的余地。

暫無
暫無

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

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