2013-03-04 62 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,然后您可以将其用作信号来停止线程处理实际套接字。