linuxマルチスレッド同時サーバ(TCP)
8637 ワード
linuxマルチスレッド同時サーバ(TCP)
マルチスレッド同時サーバとは,スレッドに基づいてクライアントごとにスレッドを作成し,スレッドによってクライアントの要求を処理する.マルチスレッドサーバに比べて、マルチプロセスサーバはプロセスを作成する際に大きなシステムリソースを消費するため、プロセスの代わりにスレッドを使用します.これにより、サービスハンドラは迅速に作成できます.
統計によると、スレッドの作成と作成プロセスは10100倍速いため、スレッドを「軽量レベル」プロセスと呼ぶ.スレッドはプロセスとは異なり、1つのプロセス内のすべてのスレッドが同じグローバルメモリ、グローバル変数などの情報を共有し、このメカニズムは同期の問題をもたらします.
CPマルチスレッド同時サーバー処理フレームワーク:
#include" "
int main()
{
sockfd
(bind)
(listen)
while(1)
{
int connfd = accept(....);
pthread_t thread_tid;
pthread_create(...);
pthread_detch(thread_tid);
}
close(sockfd);
return 0;
}
//
void* fun(coid* arg)
{
int connfd = (int)arg;
fun();//
close(connfd);
}
次に例を示します.
utili.h
#include
#include
#include
#include
#include
#include
#include
#define PORT 8888
ser.c
#include"utili.h"
void* client_fun(void *arg)
{
int recvlen = 0;
char recvbuf[1024] = "";
int connfd = (int)arg;
while((recvlen = recv(connfd,recvbuf,sizeof(recvbuf),0))>0)
{
printf("recv_buf: %s
", recvbuf);
send(connfd, recvbuf, recvlen, 0);
}
printf("client closed!
");
close(connfd);
return NULL;
}
int main()
{
int sockfd;
int log;
int connfd;
pthread_t thread_id;
//chushihua
struct sockaddr_in server,client;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
//
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
printf("socket create error
");
log = bind(sockfd,(struct sockaddr*)&server,sizeof(server));
if(log < 0)
{
printf("bindfd error
");
close(sockfd);
exit(-1);
}
log = listen(sockfd,20);
if(log < 0)
{
printf("listen error
");
close(sockfd);
exit(-1);
}
printf("waiting client >>>>>
");
while(1)
{
socklen_t client_len = sizeof(client);
//accept
connfd = accept(sockfd,(struct sockaddr*)&client,&client_len);
if(connfd < 0)
{
printf("connfd error
");
continue;
}
char cli_ip[INET_ADDRSTRLEN] = "";
inet_ntop(AF_INET, &client.sin_addr, cli_ip, INET_ADDRSTRLEN);
printf("----------------------------------------------
");
printf("client ip=%s,port=%d
", cli_ip,ntohs(client.sin_port));
pthread_create(&thread_id,NULL,(void*)client_fun,(void*)connfd);
pthread_detach(thread_id);// ,
}
close(sockfd);
return 0;
}
cli.c
#include"utili.h"
int main()
{
int sockfd;
int log;
struct sockaddr_in server;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
printf("sockfd error
");
exit(-1);
}
log = connect(sockfd,(struct sockaddr*)&server,sizeof(server));
if(log < 0)
{
printf("connect error
");
close(sockfd);
exit(-1);
}
char sendbuf[1024];
char recvbuf[1024];
while(1)
{
fgets(sendbuf,sizeof(sendbuf),stdin);
send(sockfd,sendbuf,strlen(sendbuf),0);
recv(sockfd,recvbuf,sizeof(recvbuf),0);
fputs(recvbuf,stdout);
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
close(sockfd);
return 0;
}