[英]boost::asio UDP send/receive in the same process
我已經編寫了一些基於asio的網絡類,並且只要它們在單獨的進程中運行,它們就可以按預期工作。 在提高測試覆蓋率的過程中,我遇到了一種情況,即接收方通常會停止接收數據。 由於我的(CxxTest)測試套件是單個應用程序,
create endpoint (127.0.0.1:54321, shared by rx/tx)
create service
create tx socket
open
set reusable(true)
set broadcast(true)
create rx socket
open
bind to endpoint
async_receive...
create thread(io_service::run)
send data several times
wait a few seconds
io_service::stop
thread::join
我的receive
函數只是將新數據轉儲到向量中並進行存儲,它還會打印一條打印語句,其中包含接收到的字節數。 當我跑,我得到1 receive
的呼叫與數據的預期量,有時我得到2, 極少我已經得到3。
現在,當我將這個文件切成兩半時,一個只做發送端,另一個只做接收端,效果很好。 除了刪除每個部分無關的貢獻外,沒有其他任何改變。
我已經在WireShark中進行了觀察,所有傳輸均按預期進行,並且由於它們應該是同步的,所以對我來說很有意義。 好像接收處理程序沒有看到任何新進來的東西,所以它只是靜靜地坐着。 我如何丟失數據? 我是Asio的新手,所以我希望我所做的事情顯然很愚蠢!
OK,第二次嘗試:D,但是這次我檢查了一下。
您的問題是您使用相同的端點進行發送和接收。 我也發現了這一點 :
通常,同時使用不同的對象是安全的,但同時使用單個對象是不安全的。 但是,諸如io_service之類的類型提供了更強的保證,即可以安全地同時使用單個對象。
所以,為您創造一個端點txsock
,一個用於rxsock
- >發送到send_end /從rec_end接收我得到這個結果。
send(2006)
receive(2006)
receive(2006)
send(2006)
receive(2006)
send(2006)
receive(2006)
send(2006)
send(2006)
receive(2006)
receive(2006)
send(2006)
send(2006)
receive(2006)
receive(2006)
send(2006)
received 8 packet(s) total
receive(0)
receive error: The I/O operation has been aborted because of either a thread exit or an application request
...
ba::ip::udp::endpoint send_end;
ba::ip::udp::endpoint rec_end;
send_end = ba::ip::udp::endpoint(address, 54321);
rec_end = ba::ip::udp::endpoint(address, 54321);
// ...
rxsock->bind(rec_end);
// in go and receive
rxsock->async_receive_from(ba::buffer(buffer, BUF_SZ), rec_end,
boost::bind(receive, ba::placeholders::error, ba::placeholders::bytes_transferred));
// ...
std::size_t sz = socket.send_to(b.data(), send_end);
async_receive_from
通過async_receive
它也可以(我的機器上)不增加的端點。 send_to
替換send_to
send
txsock連接到端點,它也可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.