1

基本的な TCP クライアント/サーバー プログラムがあります。

クライアントとサーバーの両方に、読み取りと書き込みを行うメソッドがあります。初めて実行したときは完全に機能しますが、再度実行すると(ループ中)、何も読み込まれません。

void printout(int newsockfd, char buffer) {
n = write(newsockfd, a2, 256);
n = write(newsockfd, a3, 256);
n = write(newsockfd, a4, 256);
n = write(newsockfd, a5, 256);
n = write(newsockfd, a6, 256);
}

サーバーで

void printout(char buffer[], int sockfd) {
bzero(buffer, 256);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
}

a2、a3、a4、a5、および a6 は文字列です。初めて実行すると、すべてが正しく印刷されます。2 回目は何も出力されず、空白行がたくさん出力されます。バッファが何であるかを調べるためにテストしたところ、「」であることがわかりました。問題が何であるか、またはどのように修正できるか知っていますか?

4

2 に答える 2

3

ループが表示されていないため、問題を特定するのは困難です。

ただし、飛び出すことの 1 つは、 へのすべての呼び出しが へwrite()の呼び出しと一致することを期待しているように見えることですread()。これは TCP の仕組みではありません。パケットはフラグメントを取得し、部分的な読み取りなどを取得できます。つまり、TCP はストリームプロトコルであり、メッセージ指向のプロトコルではありません。

read()特に、返される値が 256 バイト未満になる状況に対処する準備をしておく必要があります。read()これは、いつでもどの通話でも発生する可能性があります。

また、256 バイトのチャンクを C 文字列として扱っているため、サーバーがクライアントに依存して NUL ターミネータを提供するのではなく、独自の NUL ターミネータを追加することをお勧めします。

于 2012-01-25T16:38:24.077 に答える
0

2回目の実行でサーバーの呼び出しがbind()失敗したことに賭けます。したがって、クライアントのへの呼び出しconnect()。それらのエラー処理を手に入れましたか?

編集

特に単純なTCPの例を実行する場合、サーバーの最初の実行で、サーバーが停止した後しばらくの間、ポートを「保持」することは珍しくありません。サーバーを2回実行するbind()と、が失敗するため、サーバープロセスは接続できなくなりlisten()ますaccept()。詳細を説明することは別の質問のトピックです。

サーバーは実際には存在しないためconnect()、クライアントで障害が発生し、接続されていないソケットが残ります。そして、そのソケットからの後続のすべての読み取りはすぐに失敗し、bufferすべて0が含まれたままになります。これはあなたが見ている振る舞いの可能な説明でしょう。

この説明を除外できますか?それをチェックしてbind()connect()常に0を返しますか?

于 2012-01-25T16:40:42.373 に答える