接続をオンにするとO_NONBLOCK
、lenが戻り0
、errnoが戻りますEIO
。lenがで-1
あり、errnoがであると期待しています EAGAIN
。私が得ているものに基づいて、最初の接続に問題があると推測できます。私が理解していないのは、なぜ私がそれを手に入れているのかということです。オンにした場所をコメントアウトしてO_NONBLOCK
も、この問題はまったく発生しません。オンにすることに関して何かが足りませO_NONBLCOK
んか?
マイコード(MAIN())
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ではなく、接続がリセットされます。
2番目の悪いsceanrios_recv
のLenは-1で、errnoはEAGAINです。これは、マニュアルページに基づいてO_NONBLOCKがオンになっている場合に想定されるシナリオです。
良いsceanrios_recv
のlenは1以上であり、errnoをチェックする必要はありません。