5


2

send()recv()、ソケットプログラミング、Cを介した複数のメッセージの送信

ユーザーからの要求に応じて、kanがサーバーにメッセージを送信するプログラム(クライアント)を作成しようとしています。 コードを削除しました:

クライアント:

int main(int argc, char **argv) {

  struct sockaddr_in servaddr;
  int sock = socket(AF_INET, SOCK_STREAM, 0);

  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(6789);
  servaddr.sin_addr.s_addr = inet_addr();

  while(1) {

    char message[161];
    fgets(message, 161, stdin);

    /* Replacing '\n' with '\0' */
    char *tmp = strchr(message, '\n');
    if (tmp) *tmp = '\0';

    connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));
    send(sock, message, strlen(message), 0);
    close(sock);
  }
}

サーバ:

int main(int argc, char **argv) {

  struct sockaddr_in servaddr;
  int sock = socket(AF_INET, SOCK_STREAM, 0);

  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(6789);

  bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));
  listen(sock, 5);

  while(1) {
    int clisock = accept(sock, (struct sockaddr *) NULL, NULL);

    if (clisock >= 0) {
      int messageLength = 160;
      char message[messageLength+1];
      int in, index = 0, limit = messageLength;

      while ((in = recv(clisock, &message[index], messageLength, 0)) > 0) {
        index += in;
        limit -= in;
      }

      printf("%s\n", message);
    }

    close(clisock);
  }
}

現在、これは私が送信する最初のメッセージに対して機能します。 しかし、その後、別の接続を作成することはできません(クライアントプログラムで接続しようとすると、エラーメッセージ "Bad file descriptor"が表示されます)。 ありがとうございました :)

3 Answer


2


問題は、クライアントソケット「clisock」ではなく、リスニングソケット「sock」を閉じていることです。


2


クライアントプログラムも同じ間違いをします。最初にソケットを開くが、最初の接続が完了した後にソケットを閉じるため、次回ループでソケット記述子が有効ではない場合、ソケットを再度開く必要がありますが、それが欠落しています。上からソケット呼び出しを削除し、whileループの先頭に以下の行を追加してください

int sock = socket(AF_INET、SOCK_STREAM、0);


2


servaddr.sin_addr.s_addr = inet_addr();

クライアントコードの上記の行の代わりに、次を使用します

inet_pton(AF_INET,"",&servaddr.sin_addr);

fllowing関数のエラーチェックも実行します。