linuxマルチスレッド同時サーバ(TCP)


linuxマルチスレッド同時サーバ(TCP)


マルチスレッド同時サーバとは,スレッドに基づいてクライアントごとにスレッドを作成し,スレッドによってクライアントの要求を処理する.マルチスレッドサーバに比べて、マルチプロセスサーバはプロセスを作成する際に大きなシステムリソースを消費するため、プロセスの代わりにスレッドを使用します.これにより、サービスハンドラは迅速に作成できます.
統計によると、スレッドの作成と作成プロセスは10100倍速いため、スレッドを「軽量レベル」プロセスと呼ぶ.スレッドはプロセスとは異なり、1つのプロセス内のすべてのスレッドが同じグローバルメモリ、グローバル変数などの情報を共有し、このメカニズムは同期の問題をもたらします.
CPマルチスレッド同時サーバー処理フレームワーク:
#include"   "

int main()
{
         sockfd
         (bind)
         (listen)
    while1)
    {
        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; }