zoukankan      html  css  js  c++  java
  • socket学习笔记——并发服务器与I/O程序分割客户端

    client.c

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #include <unistd.h>
     5 #include <arpa/inet.h>
     6 #include <sys/socket.h>
     7 
     8 #define BUF_SIZE 30
     9 void error_handling(char* message);
    10 void read_routine(int sock,char* buf);
    11 void write_routine(int sock,char* buf);
    12 
    13 int main(int argc,char* argv[])
    14 {
    15     int sock;
    16     pid_t pid;
    17     char buf[BUF_SIZE];
    18     struct sockaddr_in serv_addr;
    19     if(argc != 3)
    20     {
    21         printf("usage: %s <ip><port>
    ",argv[0]);
    22         exit(1);
    23     }
    24 
    25     sock = socket(PF_INET,SOCK_STREAM,0);
    26     memset(&serv_addr,0,sizeof(serv_addr));
    27     serv_addr.sin_family = AF_INET;
    28     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    29     serv_addr.sin_port = htons(atoi(argv[2]));
    30 
    31     if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
    32         error_handling("connect error");
    33 
    34     pid = fork();
    35     if(pid == 0)
    36         write_routine(sock,buf);
    37     else
    38         read_routine(sock,buf);
    39 
    40     close(sock);
    41     return 0;
    42 }
    43 
    44 void read_routine(int sock,char* buf)
    45 {
    46     while(1)
    47     {
    48         int str_len;
    49         str_len = read(sock,buf,BUF_SIZE);
    50         if(str_len == 0)
    51             return;
    52         buf[str_len] = 0;
    53         printf("message from server;%s",buf);
    54     }
    55 }
    56 
    57 void write_routine(int sock,char* buf)
    58 {
    59     while(1)
    60     {
    61         fgets(buf,BUF_SIZE,stdin);
    62         if(!strcmp(buf,"q
    ") || !strcmp(buf,"Q
    "))
    63         {
    64             shutdown(sock,SHUT_WR);
    65             return;
    66         }
    67         write(sock,buf,strlen(buf));
    68     }
    69 }
    70 
    71 void error_handling(char* message)
    72 {
    73     fputs(message,stderr);
    74     fputc('
    ',stderr);
    75     exit(1);
    76 }

    server.c

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #include <unistd.h>
     5 #include <signal.h>
     6 #include <sys/wait.h>
     7 #include <arpa/inet.h>
     8 #include <sys/socket.h>
     9 
    10 #define BUF_SIZE 30
    11 void error_handling(char* message);
    12 void read_childproc(int sig);
    13 
    14 int main(int argc,char* argv[])
    15 {
    16     int serv_sock,clnt_sock;
    17     struct sockaddr_in serv_addr,clnt_addr;
    18     struct sigaction act;
    19     pid_t pid;
    20     socklen_t adr_sz;
    21     int str_len ,state;
    22     char buf[BUF_SIZE];
    23 
    24     if(argc != 2)
    25     {
    26         printf("usage:%s <port>
    ",argv[0]);
    27         exit(1);
    28     }
    29 
    30     act.sa_handler = read_childproc;
    31     sigemptyset(&act.sa_mask);
    32     act.sa_flags = 0;
    33     state = sigaction(SIGCHLD,&act,0);
    34 
    35     serv_sock = socket(AF_INET,SOCK_STREAM,0);
    36     memset(&serv_addr,0,sizeof(serv_addr));
    37     serv_addr.sin_family = AF_INET;
    38     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    39     serv_addr.sin_port = htons(atoi(argv[1]));
    40 
    41     if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
    42         error_handling("bind error");
    43     if(listen(serv_sock,5) == -1)
    44         error_handling("listen error");
    45     
    46     while(1)
    47     {
    48         adr_sz = sizeof(clnt_addr);
    49         clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_addr,&adr_sz);
    50         if(clnt_sock == -1)
    51             continue;
    52         else
    53             puts("connecting......");
    54 
    55         pid = fork();
    56         if(pid == -1)
    57         {
    58             close(clnt_sock);
    59             continue;
    60         }
    61         if(pid == 0)
    62         {
    63             close(serv_sock);
    64             while((str_len = read(clnt_sock,buf,BUF_SIZE)) != 0)
    65                 write(clnt_sock,buf,str_len);
    66             
    67             close(clnt_sock);
    68             return 0;
    69         }
    70         else
    71             close(clnt_sock);
    72     }
    73     close(serv_sock);
    74     return 0;
    75 }
    76 
    77 void read_childproc(int sig)
    78 {
    79     pid_t pid;
    80     int status;
    81     pid = waitpid(-1,&status,WNOHANG);
    82     printf("removed proc id:%d
    ",pid);
    83 }
    84 
    85 void error_handling(char* message)
    86 {
    87     fputs(message,stderr);
    88     fputc('
    ',stderr);
    89     exit(1);
    90 }
  • 相关阅读:
    nginx日志格式字段
    set_include_path和get_include_path用法详解
    nginx try_files 详解
    ul ol li的序号编号样式
    PHP中报500错误时如何查看错误信息
    nginx的access.log文件详解
    一些常用服务命令和配置目录
    PHP 使用 Redis
    HTML5-indexedDB使用常见错误总结
    浏览器数据库 IndexedDB 入门
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/4736661.html
Copyright © 2011-2022 走看看