嗨,我在做一个网络项目。我有一个监听传入数据的套接字。现在我想存档这个:套接字只接收100个数据包。有3-4个客户。他们在无限地发送随机数据包。我将收到100包,稍后我将处理它们。经过处理后,我会重新开始接收。但是此时有一些挂起的send() >> recv()操作。现在,我要取消/放弃挂起的recv操作。我想我们将重新记录数据,而不会处理它们。还有其他建议吗?(不好意思题题写得不好)
发布于 2013-10-13 08:23:10
关机并关闭连接。马上就会取消一切。
更好的是,重新架构您的应用程序和网络协议,以便您能够可靠地知道要接收多少数据。
在Windows上,您可以使用CancelIO取消未完成的接收,但如果接收到的内容刚好读取,则可能会导致数据丢失。
发布于 2013-10-13 10:59:08
您可以使用select()或poll()循环。你可以用信号。recv()将在接收到信号时返回,因此您可以将信号从另一个任务发送到阻塞在recv()上的任务。但是,您需要确保没有指定SA_RESTART (参见http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)
有关详细信息,请阅读I/O
发布于 2018-12-24 15:42:41
我会使用非阻塞套接字+取消套接字。您必须将数据读入专用的增量缓冲区(因为recv()可能不会同时接收所有预期的数据-如果您只能处理完整的消息)并返回到循环中的select()/poll(),您可以安全地坐下来等待:
UPD:琐碎的事件可能是数组或其句柄中的套接字的数量,这是用来标识您想要取消哪个套接字的。
https://stackoverflow.com/questions/19343007
复制相似问题