我正在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);
}
答案 0 :(得分:1)
这取决于服务器计算机,以及它可以处理的线程数。一般来说,你拥有的线程越多,操作系统在线程之间切换所花费的时间就越多,这意味着线程本身将花费更少的时间进行任何实际工作。
E.g。 pthread_t thr;
是一个单一变量,能够容纳一个线程。您可以将其重用于多个线程,但随后您将丢失导致资源泄漏的其他线程。如果你想要多个线程,你可能需要一个数组或一个列表。
结构。每个线程一个结构,每个结构包含线程信息(pthread_t
),客户端套接字以及主线程和客户端处理线程所需的所有其他内容。
没有。 connection_handler
是一个函数,每个进程在内存中只有一个函数实例,函数不会被复制。