1

ネットワーク コードを Windows から Linux に移植していますが、問題がないわけではありません。何らかの理由で、ソケットをノンブロッキングに設定すると、recvfrom が正しく機能しません。ご覧のとおり、recvfrom を呼び出した後、errno は常に EAGAIN であり、受信したパケットの数に関係なく、常に EAGAIN です。ソケットをブロックしないように設定しているコードをコメントアウトすると、コードは正常に実行されます。さて、それは機能していますが、ブロックしています...

ソケットをノンブロッキングに設定するために使用しているコードは次のとおりです。

int nonBlocking = 1;
if ( fcntl( handle, F_SETFL, O_NONBLOCK, nonBlocking ) == -1 )
{
    std::cout << "failed to set non-blocking socket" << std::endl;
    return false;
}

私が間違っていることについてのアイデアはありますか?(私の Windows ビルドでは、以下を使用して正常に動作しています。

DWORD nonBlocking = 1;
ioctlsocket( handle, FIONBIO, &nonBlocking );
4

1 に答える 1

3

まず、値を確認する前にerrno、の戻り値を確認する必要がありますrecvfrom()

それが戻った場合-1errno値は理にかなっています。

マンページからrecvfrom

ソケットで使用可能なメッセージがない場合、ソケットが非ブロッキングでない限り、受信呼び出しはメッセージの到着を待機します(fcntl(2)を参照)。この場合、値-1が返され、外部変数errnoがEAGAINに設定されます。

一言で言えば:

あなたが電話した瞬間recvfrom、読むものは何もありません

于 2013-01-31T16:44:16.770 に答える