使用线程的并发TCP服务器
我试图创建一个并发TCP服务器,它接受N已知的多个连接。例如,N=8,所以我试图创建一个预线程TCP服务器 在上面的代码中,创建了线程并调用了thread_函数,但它没有按预期工作。程序在调用thread_函数后结束,直到创建了几个线程。 实际上,我希望创建N个线程,并等待客户端使用accept连接。一旦连接,我想接收/收集数据或发送命令等。这就是为什么我有连接处理程序,但在此之前我被卡住了 任何人都可以尝试纠正线程功能吗?我有点困在这里了,谢谢。 使现代化 该计划基于 请参阅第3.2节,了解如何使用锁定和接受 调用thread_函数后,程序结束 问题是,在创建线程之后,主线程会中断并结束程序。您应该调用pthread_join 你的方法有问题。在代码中,锁定mlock,然后接受2。您正在调用关键部分中的阻塞函数。这严重限制了并行性,从而破坏了线程的许多用途 您可以尝试主线程接受新套接字并将其分派给线程的方法 调用thread_函数后,程序结束 问题是,在创建线程之后,主线程会中断并结束程序。您应该调用pthread_join 你的方法有问题。在代码中,锁定mlock,然后接受2。您正在调用关键部分中的阻塞函数。这严重限制了并行性,从而破坏了线程的许多用途使用线程的并发TCP服务器,c,multithreading,sockets,networking,tcp,C,Multithreading,Sockets,Networking,Tcp,我试图创建一个并发TCP服务器,它接受N已知的多个连接。例如,N=8,所以我试图创建一个预线程TCP服务器 在上面的代码中,创建了线程并调用了thread_函数,但它没有按预期工作。程序在调用thread_函数后结束,直到创建了几个线程。 实际上,我希望创建N个线程,并等待客户端使用accept连接。一旦连接,我想接收/收集数据或发送命令等。这就是为什么我有连接处理程序,但在此之前我被卡住了 任何人都可以尝试纠正线程功能吗?我有点困在这里了,谢谢。 使现代化 该计划基于 请参阅第3.2节,了解
您可以尝试一种主线程接受新套接字并将其分派给线程的方法。我想我们可以在服务器启动时创建一个线程池来加快速度,而不是在从主线程接受后为每个客户端创建一个新线程。@m4n07这是一个好主意。这就是我所说的派遣。您不必创建线程,您可以使用预先创建的线程。一旦我使用pthread_create…,funcName…,创建了一组线程,创建后,它将调用我指定的函数。一旦我在main中创建了线程,我如何等待客户端通过accept建立连接呢。打电话给funcName@m4n07我不知道从哪里开始。寻找一些线程池示例?使用一些条件变量?查看第3.2节,了解如何使用锁定和接受。我认为我们可以在服务器启动时创建一个线程池,而不是在从main接受后为每个客户端创建一个新线程,从而加快速度。@m4n07这是一个好主意。这就是我所说的派遣。您不必创建线程,您可以使用预先创建的线程。一旦我使用pthread_create…,funcName…,创建了一组线程,创建后,它将调用我指定的函数。一旦我在main中创建了线程,我如何等待客户端通过accept建立连接呢。打电话给funcName@m4n07我不知道从哪里开始。寻找一些线程池示例?使用一些条件变量?查看第3.2节,了解如何使用锁定和接受。为什么投票结果为关闭。请在投票前添加评论。这很有帮助!!为什么投票结果接近呢。请在投票前添加评论。这很有帮助!!
for(i=0;i<NUMBER_OF_CONNECTIONS;i++)
{
CreateThreads(i);
}
return 0;
}
//Create threads to handle the connection
void CreateThreads( int i )
{
pthread_create(&thread_tid[i], NULL, thread_function, (void *) i);
return;
}
void* thread_function(void *arg)
{
puts("In thread_function");
int client_soc,clilen;
struct sockaddr_in *clientaddr;
if( (clientaddr = malloc(addrlen)) == NULL)
printf("malloc Error\n");
printf("thread %d starting\n", (int) arg);
while(1)
{
clilen = sizeof(struct sockaddr_in);
pthread_mutex_lock(&mlock);
puts("Calling accept \n");
if ( (client_soc = accept(socket_desc, (struct sockaddr *)&clientaddr,(socklen_t*)&clilen)) < 0)
{
printf("accept error\n");
}
pthread_mutex_unlock(&mlock);
printf("Process Request...calling connection handler \n");
connection_handler(client_soc); /* process request */
close(client_soc);
}
}
//This will handle connection for each client
void *connection_handler(void *socket_desc)
{
//Receive and process.....
return 0;
}