【发布时间】:2020-08-03 03:22:27
【问题描述】:
我有这样的功能:
void create_serv_and_init_client(client_t *cl, serv_t *serv)
{
static int i = 0;
pthread_t thread_serv;
if (i == 0) {
*serv = create_serv_socket();
if (pthread_create(&thread_serv, NULL, waiting_connection, \
(void *)serv) < 0) {
perror("could not create thread");
exit(1);
}
pthread_join(thread_serv, NULL);
cl[0] = create_client(0);
printf("OK\n");
i++;
}
}
waiting_connection函数:
void *waiting_connection(void *server)
{
serv_t *serv = (serv_t *)server;
serv->newSocket = accept(serv->sockfd, (struct sockaddr*)&serv->newAddr, \
&serv->addr_size);
if (serv->newSocket < 0) {
exit(1);
}
if ((serv->childpid = fork()) == 0) {
close(serv->sockfd);
while (recv(serv->newSocket, serv->buffer, 1024, 0) != 0) {
printf("Client: %s\n", serv->buffer);
send(serv->newSocket, serv->buffer, strlen(serv->buffer), 0);
bzero(serv->buffer, sizeof(serv->buffer));
}
}
}
如果我没有 pthread_join,我将永远不会收到客户端发送的 msg,但是,它会阻塞我的程序,直到收到消息,但我想畅通无阻地等待客户端消息,所以可以这样做一个畅通无阻的等待,用于接收客户端消息?
【问题讨论】:
-
你的程序对我来说是模糊的,thread_serv 是客户端还是服务器(我投票支持服务器但是......)?您说的是 pthread_join(thread_serv, NULL); 还是此处不可见的其他 pthread_join ?您谈到“等待“客户消息”,看来您必须查看 select
-
还有“如果我不使用 pthread_join,我将永远不会收到客户端发送的 msg”并询问“pthread_join 是否可以解除阻塞?”似乎很矛盾。但可能您的问题不在于连接,如果您通过 socket 交换消息,请再次查看 select
-
如果我不 pthread_join,我将永远不会收到客户端发送的 msg 你的设计很糟糕。重新考虑你想如何做事。欢迎来到编程——你开始写东西,然后意识到你把它搞砸了,必须重新开始。如果您继续编程,这将不是您最后一次这样做。有两种类型的程序员:编写糟糕代码的程序员和说谎者。 ;-)
-
Thread_serv 是服务器,我说的是
pthread_join(thread_serv, NULL);,但我可以这样做,但我只是不明白为什么这实际上不起作用.. @bruno -
骗子?真的像吗? @AndrewHenle我必须使用pthread,因为这个函数循环并且我必须等待消息客户端,所以我不能只调用
waiting connection,因为它只会阻塞后面的程序......
标签: c sockets tcp pthreads client-server