TCPベースのマルチユーザサーバ

4271 ワード

1.マルチプロセスでマルチユーザの通信を実現
マルチプロセスバージョン:子プロセスの子プロセスである孫プロセスを使用します(子プロセスは親プロセスを待たないとゾンビプロセスになります).
#include
#include
#include
#include
#include
#include
#include
#include

void CreatWorker(int client_fd,struct sockaddr_in* client)
{
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        return;
    }
    else if(id==0)//   
    {
        if(fork()==0)//    
        {
            char buf[1024]={0};
            while(1)
            {
                ssize_t s=read(client_fd,buf,sizeof(buf));
                if(s<0)
                {
                    perror("read");
                    continue;
                }
                if(s==0)
                {
                    printf("client close
"); close(client_fd); break; } buf[s]='\0'; printf("client %s say :%s
",inet_ntoa(client->sin_addr),buf); write(client_fd,buf,strlen(buf)); } } exit(0); } else { close(client_fd); waitpid(id,NULL,0); } } int main(int argc,char* argv[]) { if(argc!=3) { printf("./server [ip] [port]
"); return 1; } struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_addr.s_addr=inet_addr(argv[1]); addr.sin_port=htons(atoi(argv[2])); int sock=socket(AF_INET,SOCK_STREAM,0); if(sock<0) { perror("socket"); return 2; } int ret=bind(sock,(struct sockaddr*)&addr,sizeof(addr)); if(ret<0) { perror("bind"); return 3; } ret=listen(sock,10); if(ret<0) { perror("listen"); return 4; } while(1) { struct sockaddr_in client; socklen_t len=sizeof(client); int client_fd=accept(sock,(struct sockaddr*)&client,&len); if(client_fd<0) { perror("accept"); continue; } CreatWorker(client_fd,&client); } return 0; }

2.マルチスレッドバージョン——新しいスレッドは要求を実行し、メインスレッドは戻って実行を継続する
#include
#include
#include
#include
#include
#include
#include
#include
#include



void Request(void* arg)
{
    int client_fd=(int)arg;
    char buf[1024]={0};
    while(1)
    {
        ssize_t s=read(client_fd,buf,sizeof(buf));
        if(s<0)
        {
            perror("read");
            continue;
        }
        else if(s==0)
        {
            printf("client close
"); close(client_fd); break; } buf[s]=0; printf("client say %s
",buf); write(client_fd,buf,strlen(buf)); } close(client_fd); return (void*)0; } int main(int argc,char* argv[]) { if(argc!=3) { printf("./server [ip][port]
"); return 1; } struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(atoi(argv[2])); addr.sin_addr.s_addr=inet_addr(argv[1]); int sock=socket(AF_INET,SOCK_STREAM,0); if(sock<0) { perror("sock"); return 1; } int ret=bind(sock,(struct sockaddr*)&addr,sizeof(addr)); if(ret<0) { perror("bind"); return 1; } ret=listen(sock,10); if(ret<0) { perror("listen"); return 1; } while(1) { struct sockaddr_in client; socklen_t len=sizeof(client); int client_fd=accept(sock,(struct sockaddr*)&client,&len); if(client_fd<0) { perror("accept"); continue; } pthread_t tid; pthread_create(&tid,NULL,Request,(void*)client_fd); pthread_detach(tid); } return 0; }