取消待定的recv?

时间:2013-10-13 07:55:38

标签: c++ sockets networking

您好我正在开展一个网络项目。我有一个正在侦听传入数据的套接字。现在我想归档这个:Socket只会收到100个数据包。而且有3-4个客户。他们无限地发送随机数据包。我将收到100个数据包,之后我会处理它们。在过程之后,我将重新开始接收。但此时还有一些待处理的send()>> recv()操作。现在我想取消/放弃挂起的recv操作。我想我们会收集数据,但我们不会处理它们。还有其他建议吗? (抱歉问题构成不好)

3 个答案:

答案 0 :(得分:3)

关闭并关闭连接。这将立即取消所有内容。

更好的是,重新架构您的应用程序和网络协议,以便可以可靠地告知要接收多少数据。

在Windows上,您可以使用CancelIO取消未完成的接收,但如果接收刚刚读取某些内容,则可能导致数据丢失。

答案 1 :(得分:1)

您可以使用select()poll()循环。 你可以使用信号。 recv()将在收到信号时返回,以便您可以将来自其他任务的信号发送到recv()上阻止的任务。但您需要确保未指定SA_RESTART(请参阅http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html

阅读http://en.wikipedia.org/wiki/Asynchronous_I/O了解更多详情

答案 2 :(得分:1)

我会使用非阻塞套接字+取消套接字。 您必须读入专用的增量缓冲区(因为recv()可能不会一次接收到所有预期的数据-如果您只能处理完整的消​​息,则可能是这种情况),然后返回到您的select()/ poll()循环,您可以安全地坐在那里等待:

  • 下一个数据
  • 下一个连接
  • 取消套接字中的取消事件,您的其他线程将向该套接字发送取消信号(一些琐碎的send())。

UPD:琐碎的事件可能是数组中的套接字号或其句柄-用于标识您要取消的套接字的个子。