Linux下socket编程之多进程TCP服务器端

来源:互联网 发布:java iterator() 编辑:程序博客网 时间:2024/06/08 11:57

代码如下:
tcp_server.c

#include<string.h>#include<stdlib.h>#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>static void usage(char* proc){    printf("usage:%s[ip][port]",proc);}ssize_t startup(char*ip,char*port){    ssize_t sock=socket(AF_INET,SOCK_STREAM,0);    if(sock<0)    {        perror("socket");        return 3;    }    struct sockaddr_in server_addr;    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(atoi(port));    server_addr.sin_addr.s_addr=inet_addr(ip);    if(bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr))<0)    {        perror("bind");        return 4;    }    if(listen(sock,10)<0)    {        perror("listen");        return 5;    }    return sock;}int main(int argc,char* argv[]){    if(argc!=3)    {        usage(argv[0]);        return 1;    }    ssize_t listen_sock=startup(argv[1],argv[2]);    struct sockaddr_in client_addr;    socklen_t len=sizeof(client_addr);    while(1)    {        ssize_t new_sock=accept(listen_sock,(struct sockaddr*)&client_addr,&len);        if(new_sock<0)        {            perror("accept");            return 2;        }        char buff[1024];        pid_t id=fork();        if(id==0)//子进程处理        {            close(listen_sock);            while(1)            {                ssize_t s=read(new_sock,buff,sizeof(buff));                if(s>0)                {                    buff[s]='\0';                    printf("client:#%s",buff);                    write(new_sock,buff,strlen(buff));                }                if(s==0)                {                    printf("client quit!\n");                    fflush(stdout);                    break;                }            }            return 0;        }        if(id>0)//问题:如果监听进程创建子进程退出以后那么监听进程的pid是一直在变化的。想要kill掉这个进程得不停的查询。        {            close(new_sock);            if(fork()>0)//用父进程创建一个子进程来接替监听任务,父进程退出以后子进程变为孤儿进程,由操作系统来回收其资源。            {                exit(0);            }        }    }    return 0;}

这个和tcp的区别不是很大,只是把本来一个程序做的事情分成了两份,用一个饭店来作比喻,前一个单进程是门前招呼客人的门童要同时担任给客人点菜的职能,所以一次只能有一个客户在点餐,直到这个客人走了门童才回去去门口招揽其他的客人进店,现在多进程就是门童招揽客人招揽完了把客人交给服务员,然后门童就回到门口继续招揽客人,服务员负责客人点菜,这样的话就可以有多个客人同时在饭店就餐,这就是多进程。
客户端程序就是使用tcp客户端就可以了,在这就不再把代码给出,如果需要请参考Linux下socket编程之TCP
下面为测试:
服务器端:
这里写图片描述
客户端1:
这里写图片描述
客户端2:

这就是多进程的tcp 欢迎大家评论

原创粉丝点击