c - Linux 中的多线程服务器

标签 c linux multithreading pthreads

我正在 Linux 环境中使用 C 进行服务器编程。同时可能有多个客户端与服务器链接。这是我在服务器编程方面的第一个项目,并且在多线程方面没有太多经验。直到现在我已经编程了以下是多线程。

我想对以下要点有所了解。

1.服务器将处理多少客户端?

2.将pthread_t thr;创建多个线程,或者我需要执行类似pthread_t thr[X]的操作来创建X个线程?

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

4. 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. 这取决于服务器机器,以及它可以处理的线程数。一般来说,您拥有的线程越多,操作系统花在线程之间切换的时间就越多,这意味着线程本身执行任何实际工作的时间会更少。

  2. 例如pthread_t thr; 是一个单一的变量,能够容纳一个线程。您可以为多个线程重用它,但随后您会松开其他线程,从而导致资源泄漏。如果您需要多个线程,您可能需要一个数组或列表。

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

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

关于c - Linux 中的多线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30725206/

相关文章:

c++ - 我的cout怎么了?

c# - Unity 编辑器的线程安全文件系统观察器

c - 如何在不使用 C 中的锁的情况下以原子方式修改结构元素?

linux - Perl 系统中的嵌套引号()

c++ - linux上c++的GUI调试器

java - 由synchronized关键字标记的关键部分与使用信号量有何不同?

java - 为不安全发布的 java.lang.String 提供恢复时间

c - 请解释一下输出

c++ - C/C++ 中的垃圾值

c - PostgreSQL - 在 C 函数中使用日期常量