0

メッセージを受信して​​ TCP で送信するアプリケーションを C で開発しようとしています。そのために、私は 2 つのスレッドを使用しています。リッスンするサーバー スレッドとそれを送信するクライアント スレッドです。

ここでサーバーとメイン関数:

void dostuff(int sock)
{
  int n;
  char buffer[256];

  bzero(buffer,256);
  n = read(sock,buffer,255);

  if (n < 0) error("ERROR reading from socket");
  else {
    pthread_t t_tcp_client;
    pthread_create(&t_tcp_client, NULL, tcp_client, buffer);
  }

  n = write(sock,"Message received",18);

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

static void *tcp_server(void *p_data)
{
  int sockfd, newsockfd, pid;
  socklen_t clilen;
  struct sockaddr_in serv_addr, cli_addr;

  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  if (sockfd < 0) error("ERROR opening socket");

  bzero((char *) &serv_addr, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(TCP_PORT);

  if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding");

  listen(sockfd,5);
  clilen = sizeof(cli_addr);

  while (1) {
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

    if (newsockfd < 0) error("ERROR on accept");

    pid = fork();

    if (pid < 0) error("ERROR on fork");

    if (pid == 0) {
      close(sockfd);
      dostuff(newsockfd);
      exit(0);
    } else {
      close(newsockfd);
    }
  }
  close(sockfd);
  return 0;
}


int main (void)
{
  pthread_t t_tcp_server;
  pthread_create(&t_tcp_server, NULL, tcp_server, NULL);

  pthread_join(t_tcp_server, NULL);

  return 0;
}

そしてクライアントスレッド:

static void *tcp_client(void *p_data)
{
  if (p_data != NULL)
  {
    char const *message = p_data;

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

  return 0;
}

問題は、クライアント スレッドが適切な文字を受信しないことです。結果は次のようになります。

送信されたメッセージ: ???~?

問題は次の行にあると思います: n = read(sock,buffer,255); しかし、その理由がよくわかりません。

ご協力ありがとうございました

4

2 に答える 2

1
static char buffer[256];

void dostuff(int sock)
{
   int n;

   bzero(buffer,256);
   n = read(sock,buffer,255);
   ...
}

ソケットを使用するときは注意してください。1回の読み取りでは、待機するメッセージの全体が得られない場合があります。

構造化メッセージの場合、定義するプロトコル(適切に定義する必要があります)は最初にメッセージ識別子を指定する必要があり、sizeof(theSpecificMessage)を受信するまで読み取ると、SpecificMessageは識別子によって識別されます。

于 2012-10-14T17:06:31.373 に答える
1

do_stuffほとんどの場合、クライアント スレッドが機能する前に終了しました。

クライアント スレッドは、終了時に解放されたスタック割り当てメモリをdo_stuff使用し、他のコードによって再利用されます。

これに対する解決策は、ヒープに割り当てられたメモリをクライアントに渡すことです。動的に割り当てられた場合、後者はクライアントが作業を完了した後に解放する必要があります。

于 2012-10-14T16:19:46.653 に答える