c - C 中的 tcp 客户端/服务器中带有线程的字符串

标签 c multithreading tcp client-server

我正在尝试用 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;
}

问题是客户端线程没有收到好的字符,结果是:

消息已发送:???~?

我认为问题出在这一行:n = read(sock,buffer,255);但我不太明白为什么。

感谢您的帮助

最佳答案

static char buffer[256];

void dostuff(int sock)
{
   int n;

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

使用套接字时要小心,一次读取可能无法提供您等待的消息的全部内容。

对于结构化消息,您定义的协议(protocol)(您应该定义好)必须首先给出一个消息标识符,然后您阅读直到收到 sizeof( theSpecificMessage ),theSpecificMessage 由该标识符标识。

关于c - C 中的 tcp 客户端/服务器中带有线程的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883836/

相关文章:

shell - 我正在尝试编写一个 shell 程序来一次执行多个命令

c - 从 C 中的函数返回枚举?

c++ - 如何从 mex 函数返回矩阵结构?

java - 记录在我的对象上获得锁定的所有线程

c - 如何为指定的子进程分配一个CPU?

java - java中的线程池执行器只允许10个线程,一旦提交第11个线程,它就会给出异常,说已达到最大限制

java - 使用子域的负载平衡/TCP 端口转发

c - 限制 C 中的库链接

c# - 如何创建 Web 浏览器控件可以使用的本地服务器

c++ - TCP 套接字 - 服务器不接受任何连接 UNIX