使用线程的并发TCP服务器

时间:2013-02-21 13:11:12

标签: c multithreading sockets networking tcp

我正在尝试创建一个并发TCP服务器,它接受N已知的多个(N个连接)。(例如N = 8)所以我正在尝试创建一个预先编写的TCP服务器。

.....

    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;
}

在上面的代码中,创建了线程并调用了thread_function()但它没有按预期工作。调用thread_function()之后程序结束,直到创建了几个线程。 我实际上想要创建“N”个线程并等待客户端连接(使用accept())。一旦连接,我想接收/收集数据(或)发送命令等。这就是我有connection_handler()的原因,但我在此之前就被卡住了。

任何人都可以尝试纠正thread_function()函数吗?我有点被困在这里。谢谢。 的更新 该计划是基于 http://www.cse.fau.edu/~jie/research/publications/Publication_files/roussevwu.pdf  请参阅第3.2节以了解使用锁和接受。

1 个答案:

答案 0 :(得分:5)

  

程序在调用thread_function()

后结束

问题是,在创建线程后,主线程会通过并结束程序。你应该致电pthread_join


您的方法存在问题。在您的代码中,您锁定mlock,然后锁定accept(2)。您正在调用关键部分中的阻止功能 。这严重限制了并行性,从而击败了线程的大部分目的。

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