多进程多线程服务器编写

xiaoxiao2021-02-27  267

多线程

int main(int argc,char* argv[]) { if(argc!=3) { printf("Usage:%s [service ip][service port]\n",argv[0]); return 1; } int sock=socket(AF_INET,SOCK_STREAM,0); //create ipv4 socket struct sockaddr_in server_socket; struct sockaddr_in client_socket; bzero(&server_socket,sizeof(server_socket)); //fill addr port server_socket.sin_family=AF_INET; server_socket.sin_addr.s_addr=inet_addr(argv[1]); server_socket.sin_port=htons(atoi(argv[2])); if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0) { perror("bind"); close(sock); return 1; } if(listen(sock,10)<0) { printf("listen error ,error code is %d,error string is :%s\n",errno,strerror(errno)); close(sock); return 2; } printf("bind and listen sucess,wait accept..\n"); for(;;) { socklen_t len=sizeof(client_socket); //int client_sock=accept(sock,(struct sockaddr*)&client_socket,&len); //return fd int new_sock=accept(sock,(struct sockaddr*)&client_socket,&len); //return fd if(new_sock<0) { //perror("accept "); continue; } printf("get new client!,[%s:%d]\n",\ inet_ntoa(client_socket.sin_addr)\ ,ntohs(client_socket.sin_port)); char buf[1024]; pid_t id=fork();//创建子进程 if(id<0) { //perror("fork"); close(new_sock); continue; } else if(id==0) {//chilld if(fork()>0) { exit(0); } close(sock); //... //provide service //read &write while(1) { ssize_t s=read(new_sock,buf,sizeof(buf)); if(s>0) { buf[s]=0; printf("Client #:%s\n",buf); write(new_sock,buf,strlen(buf)); }else if(s==0) { printf("client quit!\n"); break; } else { perror("read"); } } } else {//father waitpid(id,NULL,0); close(new_sock); } close(new_sock); } return 0; }

多线程

/************************************************************************* > File Name: service.c > Author: steve_abelieve > Mail: caoliang2025@foxmail.com > Created Time: Wed 26 Jul 2017 02:03:25 AM PDT ************************************************************************/ #include<sys/socket.h> #include<sys/types.h> #include<stdio.h> #include<arpa/inet.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<pthread.h> //multipthread void* request(void* argc) { //server : read&write int new_sock=(int)argc; char buf[1024]; while(1) { ssize_t s=read(new_sock,buf,sizeof(buf)); if(s>0) { buf[s]=0; printf("Client #:%s\n",buf); write(new_sock,buf,strlen(buf)); }else if(s==0) { printf("client quit!\n"); }else { perror("read"); } } close(new_sock); } int main(int argc,char* argv[]) { if(argc!=3) { printf("Usage:%s [service ip][service port]\n",argv[0]); return 1; } int sock=socket(AF_INET,SOCK_STREAM,0); //create ipv4 socket struct sockaddr_in server_socket; struct sockaddr_in client_socket; bzero(&server_socket,sizeof(server_socket)); //fill addr port server_socket.sin_family=AF_INET; server_socket.sin_addr.s_addr=inet_addr(argv[1]); server_socket.sin_port=htons(atoi(argv[2])); if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0) { perror("bind"); close(sock); return 1; } if(listen(sock,10)<0) { printf("listen error ,error code is %d,error string is :%s\n",errno,strerror(errno)); close(sock); return 2; } printf("bind and listen sucess,wait accept..\n"); while(1) { socklen_t len=sizeof(client_socket); int new_sock=accept(sock,(struct sockaddr*)&client_socket,&len); if(new_sock<0) { perror("accept"); continue; } printf("get new client![%s:%d]\n",\ inet_ntoa(client_socket.sin_addr)\ ,ntohs(client_socket.sin_port)); pthread_t pid; //pthread_create(&pid,NULL,request,(void*)client_socket.sin_addr); pthread_create(&pid,NULL,request,(void*)new_sock); //detach pthread_detach(pid); //线程分离,防止一个线程出现错误,导致整个进程终止 } close(sock); return 0; }
转载请注明原文地址: https://www.6miu.com/read-10251.html

最新回复(0)