您好我正在开展一个网络项目。我有一个正在侦听传入数据的套接字。现在我想归档这个:Socket只会收到100个数据包。而且有3-4个客户。他们无限地发送随机数据包。我将收到100个数据包,之后我会处理它们。在过程之后,我将重新开始接收。但此时还有一些待处理的send()>> recv()操作。现在我想取消/放弃挂起的recv操作。我想我们会收集数据,但我们不会处理它们。还有其他建议吗? (抱歉问题构成不好)
答案 0 :(得分:3)
关闭并关闭连接。这将立即取消所有内容。
更好的是,重新架构您的应用程序和网络协议,以便可以可靠地告知要接收多少数据。
在Windows上,您可以使用CancelIO取消未完成的接收,但如果接收刚刚读取某些内容,则可能导致数据丢失。
答案 1 :(得分:1)
您可以使用select()
或poll()
循环。
你可以使用信号。 recv()
将在收到信号时返回,以便您可以将来自其他任务的信号发送到recv()
上阻止的任务。但您需要确保未指定SA_RESTART
(请参阅http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)
答案 2 :(得分:1)
我会使用非阻塞套接字+取消套接字。 您必须读入专用的增量缓冲区(因为recv()可能不会一次接收到所有预期的数据-如果您只能处理完整的消息,则可能是这种情况),然后返回到您的select()/ poll()循环,您可以安全地坐在那里等待:
UPD:琐碎的事件可能是数组中的套接字号或其句柄-用于标识您要取消的套接字的个子。