3

クライアント/サーバーをセットアップしており、サーバーが接続を受け入れたかどうかをクライアントに知らせたいです。そうでなければ、私のクライアントは、それがまだ受け入れられるのを待っているという手がかりがありません. これを確認するために、さらなる通信 (プロトコル仕様) に頼ることはできません。したがって、たとえば、サーバーからクライアントに「Good to go」文字列を送信することはできません。サーバーが実際に受信しているかどうかを確認できるフラグまたは何かがありますか? いくつかのサンプル コードは次のとおりです。

/* Client */
...
getaddrinfo(ip, port, &hints, &servinfo);
connect(sockfd, info->ai_addr, info->ai_addrlen);

if (info == NULL) {
    printf("connection failure\n");
    exit(1);
}

inet_ntop(info->ai_family, get_in_addr((struct sockaddr *)info->ai_addr), ipstring, sizeof(ipstring));
printf("Connected to %s!\n", ipstring);
...

/* Server */
...
pause(); /* If don't accept the connection, how to make the client know? */ 
new_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &addr_size);
...
4

2 に答える 2

4

バックログのため、サーバーは呼び出しを受け入れる前に SYN-ACK を送信できます。したがって、クライアントの呼び出しconnect()は、サーバーの呼び出しの前に戻ることができますaccept()

あなたが言うように、サーバーからの「Good to go」メッセージはオプションではありません。どうですか: クライアントからの「エコー」リクエスト。したがって、サーバーは受け入れ後に応答します。

TCP ストリーム内の余分なトラフィックがオプションではない場合。補助データを使用できますか?

于 2012-05-11T11:41:58.910 に答える
2

失敗した理由connect()を示すため、からの戻り値を確認する必要があります。errno

あなたの場合のconnect()呼び出しはタイムアウトするため、connect()戻り-1errnoに設定されますETIMEDOUT

  int ret = connect(sockfd, info->ai_addr, info->ai_addrlen);
  if (ret == -1) {
      /* connect failed */
      switch(errno) {
      case ETIMEDOUT:
             /* your server didn't accept the connection */
      case ECONNREFUSED:
             /* your server isn't listening yet, e.g. didn't start */
      default:
             /* any other error, see man 2 connect */
      }
  }
于 2012-05-11T11:16:12.427 に答える