嗨,我正在做一个网络项目。我有一个正在监听传入数据的套接字。现在我要存档:Socket 将只接收 100 个数据包。并且有3-4个客户。他们无限地发送随机数据包。我将收到 100 个数据包,稍后我会处理它们。处理后我将重新开始接收。但此时有一些待处理的 send() >> recv() 操作。现在我想取消/放弃挂起的 recv 操作。我想我们会接收数据,我们不会处理它们。还有其他建议吗?(对不起,问题构成不好)
问问题
1479 次
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)
于 2013-10-13T10:59:08.257 回答
1
我会使用非阻塞套接字+取消套接字。您必须读入专用的增量缓冲区(因为 recv() 可能不会立即收到所有预期的数据 - 如果您只能处理完整的消息,就会出现这种情况)并返回到您的 select()/poll()循环,您可以安全地坐在那里等待:
- 下一个数据
- 下一个连接
- 来自取消套接字的取消事件,您的其他线程将向其发送取消信号(一些微不足道的 send())。
UPD:微不足道的事件可能是数组中套接字的编号或其句柄 - 用于确定您要取消哪个套接字的东西。
于 2018-12-24T15:42:41.297 回答