C++ 取消挂起的recv?

C++ 取消挂起的recv?,c++,sockets,networking,C++,Sockets,Networking,嗨,我在做一个网络项目。我有一个正在监听传入数据的套接字。现在我想存档这个:套接字将只接收100个数据包。有3-4个客户。他们无限地发送随机数据包。我将收到100个数据包,稍后我将处理它们。经过处理后,我将重新开始接收。但此时存在一些挂起的send()>>recv()操作。现在我想取消/放弃挂起的recv操作。我认为我们将接收数据,而不会处理它们。还有其他建议吗?(很抱歉问题组合不正确)关闭并关闭连接。那将立即取消一切 更好的是,重新构建您的应用程序和网络协议,以便您能够可靠地知道要接收多少数据

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

关闭并关闭连接。那将立即取消一切

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


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

关闭并关闭连接。那将立即取消一切

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

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

您可以使用
select()
poll()
循环。 你可以使用信号
recv()
将在接收到信号时返回,因此您可以从另一个任务向阻塞的任务发送信号。但您需要确保未指定
SA_RESTART
(请参阅)

阅读了解更多详细信息

您可以使用
select()
poll()
循环。 你可以使用信号
recv()
将在接收到信号时返回,因此您可以从另一个任务向阻塞的任务发送信号。但您需要确保未指定
SA_RESTART
(请参阅)


阅读了解更多详细信息

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

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

UPD:简单的事件可能是数组中套接字的编号或其句柄-用于标识要取消的套接字。

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

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

UPD:简单事件可能是数组中套接字的编号或其句柄-用于标识要取消的套接字。

只是不要调用
recv
函数。操作系统会烧坏them@EdHeal不,除非接收者关闭套接字,否则不会发生。@EJP-涉及超时机制。@EdHeal没有丢弃挂起数据的超时机制。只是不要调用
recv
函数。操作系统会烧坏them@EdHeal不,除非接收者关闭套接字,否则不会发生这种情况。@EJP-涉及超时机制。@EdHeal没有丢弃挂起数据的超时机制。有关套接字关闭工作原理的解释,请参阅。那里的信息90%是跨平台的,10%是特定于Windows的。这几乎是正确的,只是在Unix上你必须这样做:信号(SIGPIPE,SIG_-IGN);因为在另一个线程等待时关闭套接字会导致管道破裂。有关套接字关闭工作原理的说明,请参阅。那里的信息90%是跨平台的,10%是特定于Windows的。这几乎是正确的,只是在Unix上你必须这样做:信号(SIGPIPE,SIG_-IGN);因为在另一个线程等待时关闭套接字会导致管道断开。正确(但使用
epoll()
!)
select()
poll()
是过时的。这对于网络应用程序是正确的,但会使移植复杂化(如WSAPoll(),类似于仅在Windows Vista中出现的poll())。因此,如果连接的数量可以很好地预测为有限的,那么跨平台性就是问题所在——我会选择select()。虽然你是对的,但当连接数量无法控制时,速度会非常慢。好吧,有一些边缘情况是正确的(但是使用
epoll()
!)
select()
poll()
是过时的。这对于网络应用程序来说是正确的,但会使移植复杂化(比如WSAPoll(),类似于poll())仅出现在Windows Vista中)。因此,如果连接的数量可以很好地预测为有限的,那么跨平台性就是问题所在——我会选择select()。虽然你是对的,但当连接数量无法控制时,速度会慢得离谱。好吧,有一些边缘情况