簡體   English   中英

C中的tcp客戶端/服務器中帶有線程的字符串

[英]String with thread in tcp client / server in C

我正在嘗試用C開發一個應用程序來接收消息並用TCP發送它。 為此,我使用了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;
}

問題是客戶端線程沒有收到好的char,結果是:

消息傳遞:???〜?

我認為這個問題來自於:n = read(sock,buffer,255); 但我真的不明白為什么。

謝謝您的幫助

do_stuff很可能在客戶端線程完成它之前退出。

客戶端線程使用堆棧分配的內存,當do_stuff退出時,該內存已被釋放,並將被其他一些代碼重用。

解決方案是將堆分配的內存傳遞給客戶端。 如果動態分配后者則需要在客戶端完成其工作后釋放。

static char buffer[256];

void dostuff(int sock)
{
   int n;

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

使用套接字時要小心,一次讀取可能無法提供您等待的消息的全部內容。

對於結構化消息,您定義的協議(您應該很好地定義它)必須首先給出一個消息標識符,並且在您收到sizeof(theSpecificMessage)之前進行讀取,並且標識符標識特定消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM