LInux中的多线程服务器

时间:2015-06-09 07:09:47

标签: c linux multithreading pthreads

我正在Linux环境中使用C语言进行服务器编程。同时可能有几个客户端与Server相关联。这是我的第一个服务器编程项目,并且在多线程方面没有太多经验。现在我有了多线程程序化程序。

我想了解一下以下几点。

1.服务器处理的客户端会有多少?

2.will pthread_t thr;创建多个线程,还是需要像pthread_t thr[X]那样创建X线程?

3.如何在以下代码中获取每个客户的数据?

4.Will pthread_create为每个连接的新客户创建*connection_handler的新副本。

void dieWithError(char *errormsg);

FILE *file;


void *connection_handler(void *socket_desc)
{
    //Get the socket descriptor
    int sock = *(int*)socket_desc;
    int read_size;
    char *message , client_message[2000];



    //Receive a message from client
    while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
    {
        //end of string marker
        client_message[read_size] = '\0';

           printf("%s",client_message); 
           fprintf(file,"%s", client_message);


        //clear the message buffer
        memset(client_message, 0, 2000);
    }

    if(read_size == 0)
    {
        puts("Client disconnected");
        fflush(stdout);
    }
    else if(read_size == -1)
    {
        perror("recv failed");
    }

    return 0;
} 




int main(int argc, char** argv) {

    int sock_desc = 0, connfd = 0,listenfd =0;
    struct sockaddr_in serv_addr;
    int clntSock; 
    struct sockaddr_in echoClntAddr; 
    unsigned int clntLen; 
    char sendBuff[1025];
    char recvBuff[10025];
    int n = 0;
    pthread_t thr;



    sock_desc = socket(AF_INET, SOCK_STREAM, 0); 

    if(sock_desc < 0 )
       dieWithError("Unable to open Socket\n");  

    memset(&serv_addr,0,sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET ;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(7024);

    if(bind(sock_desc, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
       dieWithError("bind failed\n");

    if(listen(sock_desc,3) < 0)
       dieWithError("listen failed\n");  

     file = fopen("testServer.txt", "w");


      clntSock = sizeof(struct sockaddr);
      int i =0;
      while((connfd = accept(sock_desc, (struct sockaddr *)&echoClntAddr,(socklen_t*)&clntSock)))
    {
        puts("Connection accepted");



        if( pthread_create( &thr, NULL ,  connection_handler , (void*) &connfd) < 0)
        {
            perror("could not create thread");
            return 1;
        }

        //Now join the thread , so that we dont terminate before the thread
        //pthread_join( thread_id , NULL);
        puts("Handler assigned");
    }

    if (connfd < 0)
    {
        perror("accept failed");
        return 1;
    }

       return (EXIT_SUCCESS);
}

void dieWithError(char *errormsg){
     printf("%s", errormsg);


}

1 个答案:

答案 0 :(得分:1)

  1. 这取决于服务器计算机,以及它可以处理的线程数。一般来说,你拥有的线程越多,操作系统在线程之间切换所花费的时间就越多,这意味着线程本身将花费更少的时间进行任何实际工作。

  2. E.g。 pthread_t thr;是一个单一变量,能够容纳一个线程。您可以将其重用于多个线程,但随后您将丢失导致资源泄漏的其他线程。如果你想要多个线程,你可能需要一个数组或一个列表。

  3. 结构。每个线程一个结构,每个结构包含线程信息(pthread_t),客户端套接字以及主线程和客户端处理线程所需的所有其他内容。

  4. 没有。 connection_handler是一个函数,每个进程在内存中只有一个函数实例,函数不会被复制。