Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用线程的并发TCP服务器_C_Multithreading_Sockets_Networking_Tcp - Fatal编程技术网

使用线程的并发TCP服务器

使用线程的并发TCP服务器,c,multithreading,sockets,networking,tcp,C,Multithreading,Sockets,Networking,Tcp,我试图创建一个并发TCP服务器,它接受N已知的多个连接。例如,N=8,所以我试图创建一个预线程TCP服务器 在上面的代码中,创建了线程并调用了thread_函数,但它没有按预期工作。程序在调用thread_函数后结束,直到创建了几个线程。 实际上,我希望创建N个线程,并等待客户端使用accept连接。一旦连接,我想接收/收集数据或发送命令等。这就是为什么我有连接处理程序,但在此之前我被卡住了 任何人都可以尝试纠正线程功能吗?我有点困在这里了,谢谢。 使现代化 该计划基于 请参阅第3.2节,了解

我试图创建一个并发TCP服务器,它接受N已知的多个连接。例如,N=8,所以我试图创建一个预线程TCP服务器

在上面的代码中,创建了线程并调用了thread_函数,但它没有按预期工作。程序在调用thread_函数后结束,直到创建了几个线程。 实际上,我希望创建N个线程,并等待客户端使用accept连接。一旦连接,我想接收/收集数据或发送命令等。这就是为什么我有连接处理程序,但在此之前我被卡住了

任何人都可以尝试纠正线程功能吗?我有点困在这里了,谢谢。 使现代化 该计划基于 请参阅第3.2节,了解如何使用锁定和接受

调用thread_函数后,程序结束

问题是,在创建线程之后,主线程会中断并结束程序。您应该调用pthread_join

你的方法有问题。在代码中,锁定mlock,然后接受2。您正在调用关键部分中的阻塞函数。这严重限制了并行性,从而破坏了线程的许多用途

您可以尝试主线程接受新套接字并将其分派给线程的方法

调用thread_函数后,程序结束

问题是,在创建线程之后,主线程会中断并结束程序。您应该调用pthread_join

你的方法有问题。在代码中,锁定mlock,然后接受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;
}