我正在尝试实现一个简单的多线程客户端/服务器程序:客户端向服务器发送一个数字,服务器创建一个发回数字+ 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");
答案 0 :(得分:2)
问题在于
if (client = accept(sd, (struct sockaddr*)&from, &length) < 0) {
它被解释为
if (client = (accept(sd, (struct sockaddr*)&from, &length) < 0)) {
如果accept
返回正数,则client
设置为0
。然后从stdin中读取线程中的后续读取。