簡體   English   中英

在同一過程中boost :: asio UDP發送/接收

[英]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.

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