2013-03-04 56 views
-1

在C++中,「recvfrom的」功能是一個阻擋功能(塊線程直到分組到達)。如何從socket C++中終止線程讀取?

我該如何安全地終止阻塞在「recvfrom」中的線程?

+0

設置一些「終止」布爾,從另一個線程關閉套接字。如果UDP就像TCP一樣,recvfrom()應該返回'early'並且出現錯誤。 – 2013-03-04 19:37:50

+0

..或設置布爾和發送插座UDP報文的本地棧,所以使它返回。 – 2013-03-04 19:41:22

回答

2

一旦select/poll/epoll成功返回,請僅通過調用recvfrom來避免這種情況。

像@Remy勒博在評論中提到的,你可以上拉像下面的東西:

while(run_flag) { 
    if(check select/poll/epoll) { 
     recvfrom(..) 
    } 
} 

可以開始使用epollselect這裏。互聯網上也有很多。

另一種方法是使用異步網絡操作而不是線程。

我也可能會推薦使用boost::asio,因爲這只是您所有的網絡資料。

+0

關閉插座不工作? – 2013-03-04 19:39:01

+0

@MartinJames不同的是,他可能仍然想使用套接字,但我不知道這是否可行,實際上我甚至不知道你描述的是什麼與TCP協同工作。這聽起來很有趣,但對我來說有點冒險。 – inf 2013-03-04 19:47:09

+0

@bamboon我對「select/poll/epoll」有什麼意思? – SuB 2013-03-04 20:33:03

2

使用「自管」的把戲。

使用管道(2)系統調用打開管道。坐在循環中使用select/poll/kqueue /從你關心的套接字和管道讀取任何內容。當你從你的套接字獲取數據時,照常處理它。

要停止線程,請關閉要停止處理的線程中管道的另一端。您將在管道上將其檢測爲EOF,然後您可以將其用作信號來停止線程處理實際套接字。