【问题标题】:Server doesn't read message from client服务器不从客户端读取消息
【发布时间】:2016-03-18 07:32:33
【问题描述】:

我正在尝试实现一个简单的多线程客户端/服务器程序:客户端向服务器发送一个数字,服务器创建一个返回数字+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");

【问题讨论】:

  • 这个:'pthread_create(&th_id, NULL, &treat, &client);'如果两个客户端“同时”连接,则可能会失败。 - 'client' 在 cientserver 线程可以读取之前被 accept() 线程覆盖,但这似乎不是 ATM 的主要问题。
  • 这不是我的主要问题,但这是一个问题;感谢您指出。修好这个后我会调查的。
  • 我看不到问题:( read() 调用应该返回并且应该打印一些东西。这可能不是您所期望的,因为您未能正确处理 read() 返回的结果, 但应该打印一些东西:(
  • @MartinJames 您能否详细说明您提到的第二个问题?解决方案会是什么样子?我想制作一个客户端副本并将引用传递给它,但在下一个循环中它也可以覆盖该副本。据我所知,线程的函数只能接收一个指针作为参数,那么我该如何解决这个问题?
  • 我猜在循环内声明一个新指针,将client 分配给它并将其传递给线程解决问题?然后在下一个循环中,没有什么可以覆盖了。

标签: c multithreading sockets network-programming


【解决方案1】:

问题出在一行

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

它被解释为

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

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

【讨论】:

  • 很好 - 有一条上船!我应该注意到这一点,尤其是因为我总是抱怨开发人员。调试时未能拆分复合表达式。
  • 另外,这不是我第一次看到这个错误。对我来说,使用错误的表达方式似乎并不“自然”。当然,我会将“client=accept()”放在单独的行上。我怀疑有,(再次),一些垃圾网站以这个糟糕的代码为例:(
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多