服务器不读取客户端的消息

时间:2015-12-12 12:00:06

标签: c multithreading sockets network-programming

我正在尝试实现一个简单的多线程客户端/服务器程序:客户端向服务器发送一个数字,服务器创建一个发回数字+ 1的线程。

问题如下: 客户端连接到服务器没有问题; 线程是(据我所知)创建没有问题;但是在客户端在套接字中写入数字后,服务器根本看不到它。对read()的调用没有错误,只是坐在那里,永远等待。

我尝试通过它发送多个整数;没有不同。 我怀疑是文件描述符服务器端是不是直接传递给线程,但我无法弄清楚如何。我的另一个怀疑是我错过了一些愚蠢明显的东西。

无论哪种方式,我们都非常感激。 有什么想法吗?

服务器端:创建线程的循环。

    while (1) {

    int client;

    printf("[server]Waiting at port %d...\n", PORT);
    fflush(stdout);

    int length = sizeof(from);
    if (client = accept(sd, (struct sockaddr*)&from, &length) < 0) {
        perror("[server]Error: accept().");
        continue;
    }

    pthread_t th_id;
    pthread_create(&th_id, NULL, &treat, &client);

    }

服务器端:线程的处理功能(问题出在这里)。

void* treat(void* client)
{

printf("[thread]Waiting for message...\n");
fflush(stdout);
pthread_detach(pthread_self());

int client_sd = *((int*)client);

int nr;
if (read(client_sd, &nr, sizeof(int))) {
    perror("[thread]Error: read().");
    exit(-1);
}
// The program won't reach this point.
printf("[thread]Read: %d", nr);
fflush(stdout);

close(*((int*)client));
return (NULL);

}

客户端:

      if (connect (sd, (struct sockaddr *) &server,sizeof (struct sockaddr)) == -1)
    {
      perror ("[client]Error: connect().\n");
      return errno;
    }

  printf ("[client]Write a number: ");
  fflush (stdout);

  scanf("%d",&nr);

  printf("[client] Read %d\n",nr);

  if (write (sd,&nr,sizeof(int)) <= 0)
    {
      perror ("[client]Error: write()\n");
      return errno;
    }

    //the program reaches here.
  printf("[client]The message was sent\n");

1 个答案:

答案 0 :(得分:2)

问题在于

if (client = accept(sd, (struct sockaddr*)&from, &length) < 0) {

它被解释为

if (client = (accept(sd, (struct sockaddr*)&from, &length) < 0)) {

如果accept返回正数,则client设置为0。然后从stdin中读取线程中的后续读取。