我正在 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);
}
最佳答案
这取决于服务器机器,以及它可以处理的线程数。一般来说,您拥有的线程越多,操作系统花在线程之间切换的时间就越多,这意味着线程本身执行任何实际工作的时间会更少。
例如
pthread_t thr;
是一个单一的变量,能够容纳一个线程。您可以为多个线程重用它,但随后您会松开其他线程,从而导致资源泄漏。如果您需要多个线程,您可能需要一个数组或列表。结构。每个线程一个结构,每个结构包含线程信息 (
pthread_t
)、客户端套接字以及主线程和客户端处理线程所需的所有其他内容。没有。
connection_handler
是一个函数,内存中每个进程只有一个函数实例,函数不会被复制。
关于c - Linux 中的多线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30725206/