2013-02-21 85 views
1

我试图创建一个并发的TCP服务器,它接受多个(N连接),其中N是已知的(例如N = 8)所以我试图创建一个prethreaded的TCP服务器。并发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()函数吗?我有点困在这里。谢谢。 UPDATE 该程序是基于 http://www.cse.fau.edu/~jie/research/publications/Publication_files/roussevwu.pdf 看看3.2节使用锁定和接受。

+0

为什么投票结束。请在投票前添加评论。它有帮助! – m4n07 2013-02-21 14:54:16

回答

5

程序告一段落调用thread_function()

的问题是,你创建线程后,主线程落空,结束程序后。您应该致电pthread_join


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

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

+0

我认为我们可以通过在服务器启动时创建线程池来加速,而不是在从main()接受()之后为每个客户端创建新线程。 – m4n07 2013-02-21 13:22:35

+0

@ m4n07这是个好主意。这就是我“派遣”的意思。你不必创建线程,你可以使用预先创建的线程。 – cnicutar 2013-02-21 13:23:20

+0

一旦我使用pthread_create(..,..,funcName,..)创建一堆线程,一旦创建它就调用我指定的函数。一旦我在main中创建线程,我如何等待客户端通过accept()建立连接。并调用funcName() – m4n07 2013-02-21 13:36:01