【发布时间】: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