linux网络编程 多进程服务器

服务器设置为接受所有ip地址的请求,不同ip地址可以同一时间访问服务器。服务器通过fork,让每一个连接的客户端对应一个子进程为客户端服务,在客户端下线时有服务器父进程循环回收死去的子进程。

服务器:

  1 #include<stdlib.h>
  2 #include<sys/socket.h>
  3 #include<stdio.h>
  4 #include<arpa/inet.h>
  5 #include<unistd.h>
  6 #include<strings.h>//bzero
  7 #include<fcntl.h>
  8 #include<wait.h>
  9 #include<signal.h>
 10 #define server_port 8888
 11 void wait_child(int arg)
 12 {
 13         while((waitpid(0,NULL,WNOHANG))>0);
 14 }
 15 void main(void)
 16 {
 17         pid_t pid;
 18         char buf[BUFSIZ];
 19         char i_ntop[BUFSIZ];
 20         int n,i;
 21         int server_sock,clien_sock;
 22         server_sock=socket(AF_INET,SOCK_STREAM,0);
 23         struct sockaddr_in clien_sockaddr;
 24         struct sockaddr_in server_sockaddr;
 25         socklen_t clien_sock_len=sizeof(clien_sockaddr);
 26         bzero(&server_sockaddr,sizeof(server_sockaddr));
 27         server_sockaddr.sin_family=AF_INET;
 28         server_sockaddr.sin_port=htons(server_port);
 29         server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
 30         bind(server_sock,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr));
 31         listen(server_sock,128);
 32         while(1){
 33                 clien_sock=accept(server_sock,(struct sockaddr *)&clien_sockaddr,&clien_sock_len);
 34                 pid=fork();
 35                 if(pid==0){
 36                         close(server_sock);
 37                         break;
 38                 }
 39                 if(pid>0){
 40                         close(clien_sock);
 41                         signal(SIGCHLD,wait_child);
 42                 }
 43         }if(pid==0){
 44                 while(1){
 45                         n=read(clien_sock,buf,sizeof(buf));
 46                         if(n==0){
 47                                 close(clien_sock);
 48                                 exit(0);
 49                         }else if(n<0){
 50                                 perror("read error");
 51                                 exit(1);
 52                         }else{
 53                                 printf("clien_ip=%s--clien_port=%d\n",inet_ntop(AF_INET,&clien_sockadd    r.sin_addr.s_addr,i_ntop,sizeof(i_ntop)),ntohs(clien_sockaddr.sin_port));
 54                                 printf("%s\n",buf);
 55                         }
 56                 }
 57         }
 58 }

客户端:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<arpa/inet.h>
  4 #include<sys/socket.h>
  5 #include<strings.h>
  6 #include<string.h>
  7 
  8 #define clien_addr "127.0.0.1"
  9 #define clien_port 8888
 10 void main(void)
 11 {
 12         //建立套接字
 13         int clien_sock;
 14         clien_sock=socket(AF_INET,SOCK_STREAM,0);
 15         //设置sockaddr_in结构体 
 16 
 17         struct sockaddr_in clien_sockaddr;
 18         bzero(&clien_sockaddr,sizeof(clien_sockaddr));
 19         clien_sockaddr.sin_family=AF_INET;
 20         clien_sockaddr.sin_port=htons(clien_port);
 21 //      clien_sockaddr.sin_addr.s_addr=inet_addr(clien_addr);
 22         inet_pton(AF_INET,clien_addr,&clien_sockaddr.sin_addr.s_addr);
 23         //绑定套接字与网络ip,端口号
 24         bind(clien_sock,(struct sockaddr *)&clien_sockaddr,sizeof(clien_sockaddr));
 25         //发送连接请求
 26         connect(clien_sock,(struct sockaddr *)&clien_sockaddr,sizeof(clien_sockaddr));
 27         //向服务器输入数据
 28         while(1){
 29         char buf[1024];
 30         fgets(buf,sizeof(buf),stdin);
 31         write(clien_sock,buf,strlen(buf));
 32         }
 33 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值