ソケットを使用して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 バイトのプレフィックス値よりも小さい) でデータを送信した場合、またはネットワークの問題である場合、私のアプリケーションは「応答していません」になります。 " 状態で、閉じる必要があります (ブロッキング ソケットを使用しているため)。ソケット アプリケーションをより柔軟にする方法はありますが、この問題を解決するためにソケットをノンブロッキング モードに切り替えませんか (または、データやアルゴリズムを整理するためのアイデアも)