TCP通信でrecvで不明な点。
今、クライアントPCが接続してきて、接続できたら、そのクライアントが渡してくるデータを受け取るプログラムを作っています。下のプログラムを使用しています。
j = recv(NewSocket, RecvBuf, sizeof(RecvBuf), 0);
ここで、データをRecvBufというのに入れて、そのデータ量が1212byteだというということがわかりました。それがだいたい5秒に1回程度受信されることがわかりました。
このプログラムだと1212byte受信後に、すぐに
j = recv(NewSocket, RecvBuf, sizeof(RecvBuf), 0);
このコードを実行しても j = 0が代入されていて、closesocket(NewSocket);が実施されて、接続を切断しているので、その接続を維持したままにできないかと思い、
if(j <= 0) // データを受け取ったか?
break; // エラーなら抜ける
この部分のプログラムをコメントアウトしてclosesocket(NewSocket);を実施しないようにしたら、5秒以上たっても、1212byteを受信できなくなってしまいました。
この方法だとなぜデータが受信できないのかご教授よろしくお願い致します。
(現在使用しているコードの一部)
printf("%d番ポートで接続待機中\n", PORT); // 接続待機中のメッセージ表示
while(1) // サーバループ
{
i = sizeof(AddrInfo); // SOCKADDR構造体の長さをセットしておく
NewSocket = accept(RootSocket, (SOCKADDR *)&AddrInfo, &i); // 接続を待ち受ける
if(NewSocket == 0) // エラーがあるか?
break; // エラーがあればサーバループを抜ける
printf("%sと接続しました\n", inet_ntoa(AddrInfo.sin_addr)); // 接続元のIPアドレスを表示
// TCP/IPデータの受信
while(1)
{
j = recv(NewSocket, RecvBuf, sizeof(RecvBuf), 0); // クライアントからのデータを読み込む
if(j <= 0) // データを受け取ったか?
break; // エラーなら抜ける
RecvBuf[j] = 0; // 受信データに文字列終端をセットする
//if(strstr(RecvBuf, "q")) // qという文字列が含まれているか?
// break; // そうならループを抜ける
//for(i = 0; i < 30; i++) // 受信した文字列の長さだけ繰り返す
// RecvBuf[i] += 1; // 1文字進める
if(j != 0) // データを受け取ったか?
{
for(i = 0; i < 30; i++) // 受信した文字列の長さだけ繰り返す
ShowBuf[i] = RecvBuf[i]; // 1文字進める
//send(NewSocket, RecvBuf, strlen(RecvBuf), 0); // 加工したデータをクライアントに送信
for(i = 0; i < 30; i++)
printf("%#x " , ShowBuf[i]); // サーバから受け取った文字列を表示
printf("cnt %d \n",j);
}
}
//send(NewSocket, RecvBuf, strlen(RecvBuf), 0); // 加工したデータをクライアントに送信
closesocket(NewSocket); // 生成されたソケットを開放
printf("%sと切断しました\n", inet_ntoa(AddrInfo.sin_addr)); // 切断メッセージ表示
}
お礼
ご返答ありがとうございます。 なんとか解決できました。 サーバはクライアントからの切断を関知しないんですね。。 クライアント切断後、サーバで再びListen、Acceptを実行することにより解決できました。 ありがとうございました。