1

ソケットを使用してLANでプレイするゲームを書いています。次のように、残りのデータの数を知るために、4 バイト長のプレフィックスを使用します。

void trust_recv(int sock, int length, char *buffer)
{
    int recved = 0;
    int justRecv;

    while(recved < length) {
        justRecv = recv(sock, buffer + recved, length - recved, 0);
        if (justRecv < 0) return;

        recved += justRecv;
    }
}

void onDataArrival(int sock)
{
    int length;
    char *data;

    trust_recv(sock, 4, (char *) &length);
    data = new char[length];

    trust_recv(sock, length, data);
    do_somethings_with_data(data);
}

問題は、誰か (侵入者やハッカーなど) が他の形式 (おそらく 2 バイトのみ、または残りの長さが 4 バイトのプレフィックス値よりも小さい) でデータを送信した場合、またはネットワークの問題である場合、私のアプリケーションは「応答していません」になります。 " 状態で、閉じる必要があります (ブロッキング ソケットを使用しているため)。ソケット アプリケーションをより柔軟にする方法はありますが、この問題を解決するためにソケットをノンブロッキング モードに切り替えませんか (または、データやアルゴリズムを整理するためのアイデアも)

4

1 に答える 1

0

setsockopt()呼び出しとSO_RCVTIMEOパラメーターを使用して、ソケットのセットアップ段階で受信タイムアウトを設定できます。

struct timeval tv;

tv.tv_sec =8;
tv.tv_usec = 0 ;

if (setsockopt (your_sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) 
    perror(“setsockopt error”);

recv()次に、と彼のリターンをテストしますerrno

if (justRecv < 0)
{
    if (errno == EAGAIN)
        perror("TIMEOUT!");
    return;
}    
于 2013-01-21T11:07:18.187 に答える