socket网络通信 多进程并发服务器程序linux网络编程

it2026-01-22  3

List item

socket服务器客户端代码详细解析见我的另一篇博客socket网络编程

服务器端程序

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<arpa/inet.h> #include<ctype.h> #include<strings.h> #include<sys/wait.h> #include<signal.h> #include<string.h> #include<errno.h> #define SERV_IP "127.0.0.1" #define SERV_PORT 6666 void wait_child(int signo) { while(waitpid(0,NULL,WNOHANG)>0);//回收子进程 return; } //带检查的read函数 ssize_t Read(int fd,void *ptr,size_t nbytes) { ssize_t n; again: if( (n = read(fd,ptr,nbytes))==-1) { if(errno==EINTR) goto again; else return -1; } return n; } int main() { pid_t pid; int ret; int lfd,cfd; struct sockaddr_in serv_addr, clie_addr; socklen_t clie_addr_len; char buf[BUFSIZ],clie_ip[BUFSIZ]; char s_ip[BUFSIZ]; int port; lfd=socket(AF_INET,SOCK_STREAM,0); if(lfd==-1) { perror("socket error"); exit(1); } bzero(&serv_addr,sizeof(serv_addr)); //设置网络类型,端口号,ip serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERV_PORT); serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); //inet_pton(AF_INET,SERV_IP,&serv_addr.sin_addr.s_addr); ret=bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//绑定ip和端口号 if(ret==-1) { perror("bind error"); exit(1); } listen(lfd,128); while(1)//循环等待客户端连接请求 { clie_addr_len=sizeof(clie_addr); cfd=accept(lfd,(struct sockaddr *)&clie_addr,&clie_addr_len);//与客服端连接 printf("client ip=%s , port= %d\n", inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr,clie_ip,sizeof(clie_ip)), ntohs(clie_addr.sin_port) ); if(cfd==-1) { perror("accept error"); exit(1); } pid=fork(); if(pid<0) { perror("fork error"); exit(1); } else if(pid==0) { strcpy(s_ip,clie_ip); port=ntohs(clie_addr.sin_port); close(lfd); break; } else { close(cfd); signal(SIGCHLD,wait_child); } } if(pid==0) { int n; while(1) { n=Read(cfd,buf,sizeof(buf)); if(n==0)//客服端关闭 { close(cfd); return 0; } else if(n==-1) { perror("read error"); exit(1); } else { printf("Read %s , from client, ip:%s , port:%d------",buf,s_ip,port); for(int i=0;i<n;i++) buf[i]=toupper(buf[i]); write(cfd,buf,n); printf("write to client : %s:\n",buf); } } } return 0; }

客户端

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/socket.h> #include<ctype.h> #include<arpa/inet.h> #include<string.h> #define SERV_IP "127.0.0.1" #define SERV_PORT 6666 int main() { int cfd,sfd; struct sockaddr_in serv_addr; socklen_t serv_addr_len; char buf[BUFSIZ],clien_ip[BUFSIZ]; int n; char *find; memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERV_PORT);//转换为网络字节序 //serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY可以自行寻找ip inet_pton(AF_INET,SERV_IP,&serv_addr.sin_addr.s_addr); cfd=socket(AF_INET,SOCK_STREAM,0);//创建本地套接字 // bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//绑定 connect(cfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr) ); while(1) { fgets(buf,sizeof(buf),stdin);//从输入端读一行数据存入缓存区中 find=strchr(buf,'\n'); if(find) *find='\0';//去掉fgets中的换行符 write(cfd,buf,strlen(buf)); n=read(cfd,buf,sizeof(buf)); write(STDOUT_FILENO,buf,n); printf("\n"); } close(cfd); return 0; }

结果如下:

客户端1 客户端2 服务器端:

最新回复(0)