大家好 我正在使用一个非阻塞的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
但之后它陷入了刷新(套接字)方法。任何想法为什么它表现得像那样
答案 0 :(得分:0)
您将int
类型的套接字句柄转换为对std::ostream
的引用,以避免在您尝试将其发送到flush
时出现编译器警告/错误。我很惊讶它并没有崩溃。
你无法腾出更多空间。问题不在于你:问题在于系统的内部缓冲区是否已满,并且它们将在自己的时间内以自己的速度消耗。您可以通过一遍又一遍地尝试send
进行轮询,直到它有效(在这种情况下,为什么使用非阻塞套接字?),或者使用select
,poll
,{ {1}},kqueue
,epoll
等等,直到套接字能够接受更多数据为止。