1

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

4

3 回答 3

4

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

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

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

于 2013-10-13T08:23:10.623 回答
1

您可以使用select()poll()循环。你可以使用信号。recv()将在收到信号后返回,因此您可以将信号从另一个任务发送到阻塞的任务recv()。但是你需要确保你没有指定SA_RESTART(见http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html

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

于 2013-10-13T10:59:08.257 回答
1

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

  • 下一个数据
  • 下一个连接
  • 来自取消套接字的取消事件,您的其他线程将向其发送取消信号(一些微不足道的 send())。

UPD:微不足道的事件可能是数组中套接字的编号或其句柄 - 用于确定您要取消哪个套接字的东西。

于 2018-12-24T15:42:41.297 回答