0

TCP ソケットを使用して通信する単純なクライアントおよびサーバー プログラムをセットアップしました。サーバーは、クライアントからのメッセージを受信したかどうかにかかわらず、クライアントが接続して応答するのを待ちます。以下は、サーバーとクライアントでのコードの実装方法です。

サーバー側のコード:

 listen(sockfd,5);

 clilen = sizeof(cli_addr);
 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

 if (newsockfd < 0)
      error("ERROR on accept");
 bzero(buffer,256);

 n = read(newsockfd,buffer,255);

 if (n < 0)
     error("ERROR reading from socket");

 printf("Here is the message: %s\n",buffer);

 n = write(newsockfd,"I got your message",18);

 if (n < 0)
     error("ERROR writing to socket");

クライアント側のコード:

if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
    error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
     error("ERROR writing to socket");
else
    printf("sucess. n = %d", n);

bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
     error("ERROR reading from socket");

ここで、サーバーを起動してからクライアントを起動したとします。クライアントはサーバーに正常に接続します。次に、サーバーをシャットダウンし、クライアントからメッセージを送信しようとしましたが、write()操作はエラーを返しません。ここで期待しているのは、サーバーが実際にパケットを受信しない (シャットダウンされている) ため、エラーです。

だから私の質問は: write()(またはsend()sendto()またはsendmsg()) がメッセージをサーバーに正常に配信するかどうかを知る方法はありますか?

4

2 に答える 2

4

いいえ。書き込みまたは送信は単に会話を行い、フィードバックを待ちません (TCP の場合の ACK など)。ただし、なんらかのフィードバックを受け取った場合にのみ、メッセージが正常に配信されたことを確認できます。前のメッセージがまだクライアントにない間に実行される可能性があるため、別の送信を試行しても役に立ちません。また、受信したデータがメッセージを送信する前にピアから送信された可能性があるため、recv してエラーを期待しても役に立ちません。本当に確実な唯一の方法は、アプリケーション プロトコルにある種の明示的なハンドシェイクを配置し、メッセージに対する一致する応答を待つことです。

于 2014-02-03T02:23:44.697 に答える
1

そのようには機能しません。write() は、メッセージが送信バッファーに収まるとすぐに成功を返します。メッセージがサーバーによって受信および処理されたことを知る唯一の方法は、「メッセージを受け取りました」を解析する e を受信することです。

write() が -1 を返す場合、接続が閉じられているか無効であることが既にわかっていますが、考えられるすべてのエラーを検出するためにそれを当てにしないでください。

于 2014-02-03T02:15:33.647 に答える