Flush Socket阻止非阻塞SocketHi中的呼叫

时间:2010-10-28 05:11:35

标签: networking

大家好    我正在使用一个非阻塞的Socket来发送消息。我们偶尔会得到EGAIN错误。因此我决定使用Flush(套接字)刷新缓冲区并为新空间腾出空间,以便我可以避免EGAIN错误。但问题是冲洗(插座)无限期卡住。

这是代码

 int res = send(socket, buffer, size+lengthSize,0);


 delete buffer; 

 if ( res== -1 ) 

{

 int error = errno;

 cout("ERROR on SendOnPortString, errno = " << error);

 return 0 ;

 }

 else

 {

  cout<<"Send SucessFul = " << res << "Total Message size"<< size+lengthSize;

  if(res==size+lengthSize)

   flush((ostream&)socket);

  //flush(socket); 


   return 1  ; 

  }

此代码打印 发送SucessFul = 11总消息大小11

但之后它陷入了刷新(套接字)方法。任何想法为什么它表现得像那样

1 个答案:

答案 0 :(得分:0)

您将int类型的套接字句柄转换为对std::ostream的引用,以避免在您尝试将其发送到flush时出现编译器警告/错误。我很惊讶它并没有崩溃。

你无法腾出更多空间。问题不在于你:问题在于系统的内部缓冲区是否已满,并且它们将在自己的时间内以自己的速度消耗。您可以通过一遍又一遍地尝试send进行轮询,直到它有效(在这种情况下,为什么使用非阻塞套接字?),或者使用selectpoll,{ {1}},kqueueepoll等等,直到套接字能够接受更多数据为止。