当我打开O_NONBLOCK
我的连接 len 返回0
并且我的 errno 返回EIO
。我期待 len 是-1
并且 errno 是 EAGAIN
。根据我得到的信息,我可以假设初始连接存在问题。我不明白为什么我会得到它。如果我注释掉我打开的位置,O_NONBLOCK
我根本没有这个问题。我在打开方面错过了什么O_NONBLCOK
吗?
我的代码(主())
long len;
//Var for O_NONBLOCKING
int flags;
printf("R thread - starting\n");
MainTcpipIndex = TcpipIndex = 0;
while ( fMainShutdown == FALSE )
{
s_MuxWait(5000, "", &hevTcpipBuffAvail[MainTcpipIndex], 0);
if ( hevTcpipBuffAvail[MainTcpipIndex] == 0)
continue;
len = s_recv( lSocket, TcpipRecord[MainTcpipIndex].TcpipBuffer,
sizeof(TcpipRecord[MainTcpipIndex].TcpipBuffer));
//initialize flags var
flags = fcntl(lSocket, F_GETFL, 0);
//turns on O_NONBLOCKING
fcntl(lSocket, F_SETFL, flags | O_NONBLOCK);
if (len == -1 || len == 0 && errno != EAGAIN) //0 = connection broken by host
{
ReceiveError = errno;
hevReceiveError = 1;
printf("R_main - set hevReceiveError ON\n");
pthread_exit(NULL);
}
//catches O_NONBLOCK
if (len == -1 && errno == EAGAIN)
{
LogMessage(&LogStruct, INFO, LOGQUEUE + LOGSCREEN, "Caught the
O_NONBLOCKING\n");
len = 0;
continue;
}
// Record Length
TcpipRecord[MainTcpipIndex].ulTcpipBufLen = len;
// Tell T Thread we have a message
hevTcpipBuffUsed[MainTcpipIndex] = 1;
hevTcpipBuffAvail[MainTcpipIndex] = 0;
// Maintain Index
if ( ++MainTcpipIndex >= MAX_TCPIP_BUFFS )
MainTcpipIndex = 0;
}//end while
编辑
也许我第一次没有说清楚,我知道errno和len与s_recv
我的问题是我打开O_NONBLOCK时得到了不想要的结果;s_recv
的 errno 是 EIO,它的 len 是 0。如果我关闭,O_NONBLOCK
那么我的所有问题都会消失;len 为 1 或更大,不需要检查 errno。
以下是我期望的场景示例:
在第一个坏情况下s_recv
,Len 为 0 或 -1,errno 不是 EAGAIN,连接被重置。
在第二个坏场景s_recv
中,Len 是-1,errno 是 EAGAIN。这是根据手册页打开 O_NONBLOCK 时的预期场景。
在好的场景s_recv
中 len 大于 1 不需要检查 errno。