• 回声客户端的完美实现


    server.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 10240
      9 void error_handling(char *message);
     10 
     11 char res[10];
     12 char *calc(char *s)
     13 {
     14     int len = strlen(s), i;
     15     int n = 0;
     16     for (i = 0; i < len; i++)
     17         if (s[i] == ' ')
     18         {
     19             i++;
     20             break;
     21         }
     22         else
     23             n = n * 10 + (s[i] - '0');
     24     int *num = malloc(sizeof(int) * n);
     25     int tot = 0, x = 0;
     26 
     27     for (; i < len; i++)
     28     {
     29         if (s[i] == '+' || s[i] == '*' || s[i] == '-')
     30             break;
     31         if (s[i] == ' ')
     32         {
     33             num[tot++] = x;
     34             x = 0;
     35         }
     36         else
     37             x = x * 10 + (s[i] - '0');
     38     }
     39     int ans = 0;
     40     if (s[i] == '+')
     41     {
     42         for (int i = 0; i < tot; i++)
     43             ans += num[i];
     44     }
     45     else if (s[i] == '*')
     46     {
     47         ans = 1;
     48         for (int i = 0; i < tot; i++)
     49             ans *= num[i];
     50     }
     51     else if (s[i] == '-')
     52     {
     53         ans = num[0];
     54         for (int i = 1; i < tot; i++)
     55             ans -= num[i];
     56     }
     57     free(num);
     58     sprintf(res, "%d", ans);
     59     return res;
     60 }
     61 int main()
     62 {
     63     int serv_sock, clnt_sock;
     64     char message[BUF_SIZE];
     65     int str_len;
     66 
     67     struct sockaddr_in serv_adr, clnt_adr;
     68     socklen_t clnt_adr_sz;
     69 
     70     serv_sock = socket(PF_INET, SOCK_STREAM, 0);
     71     if (serv_sock == -1)
     72         error_handling("socket() error");
     73 
     74     memset(&serv_adr, 0, sizeof(serv_adr));
     75     serv_adr.sin_family = AF_INET;
     76     serv_adr.sin_addr.s_addr = inet_addr("127.0.0.1");
     77     serv_adr.sin_port = htons(9190);
     78 
     79     if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
     80         error_handling("bind() error");
     81 
     82     if (listen(serv_sock, 5) == -1)
     83         error_handling("listen() error");
     84 
     85     clnt_adr_sz = sizeof(clnt_adr);
     86     clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_adr, &clnt_adr_sz);
     87     if (clnt_sock == -1)
     88         error_handling("accept() error");
     89     str_len = read(clnt_sock, message, BUF_SIZE);
     90     write(clnt_sock, calc(message), str_len);
     91     close(clnt_sock);
     92     close(serv_sock);
     93     return 0;
     94 }
     95 
     96 void error_handling(char *message)
     97 {
     98     fputs(message, stderr);
     99     fputc('
    ', stderr);
    100     exit(1);
    101 }

    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 #define BUF_SIZE 10240
     8 void error_handling(char *message);
     9 
    10 int main(int argc, char *argv[])
    11 {
    12     int sock;
    13     char message[BUF_SIZE];
    14     int str_len;
    15     struct sockaddr_in serv_adr;
    16     if (argc != 3)
    17     {
    18         printf("Usage : %s <IP> <port>
    ", argv[0]);
    19         exit(1);
    20     }
    21 
    22     sock = socket(PF_INET, SOCK_STREAM, 0);
    23     if (sock == -1)
    24         error_handling("socket() error");
    25     memset(&serv_adr, 0, sizeof(serv_adr));
    26     serv_adr.sin_family = AF_INET;
    27     serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
    28     serv_adr.sin_port = htons(atoi(argv[2]));
    29 
    30     if (connect(sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
    31         error_handling("connect() error");
    32     else
    33         printf("连接成功!
    ");
    34     int n, i;
    35     char temp[20];
    36     puts("请输入你要计算的数字个数:");
    37     scanf("%d", &n);
    38     sprintf(temp, "%d", n);
    39     strcat(temp, " ");
    40     strcat(message, temp);
    41     for (i = 0; i < n; i++)
    42     {
    43         printf("请输入第 %d 个数字:", i + 1);
    44         scanf("%s", temp);
    45         strcat(temp, " ");
    46         strcat(message, temp);
    47     }
    48     puts("请输入你要进行的运算符(+,-,*):");
    49     scanf("%s", temp);
    50     strcat(message, temp);
    51     write(sock, message, strlen(message));
    52     str_len = read(sock, message, BUF_SIZE - 1);
    53     message[str_len] = 0;
    54     printf("运算的结果是: %s
    ", message);
    55     return 0;
    56 }
    57 void error_handling(char *message)
    58 {
    59     fputs(message, stderr);
    60     fputc('
    ', stderr);
    61     exit(1);
    62 }
  • 相关阅读:
    优步UBER司机全国各地奖励政策汇总 (4月4日-4月10日)
    苏州Uber优步司机奖励政策(4月2日~4月3日)
    成都Uber优步司机奖励政策(4月5日)
    北京Uber优步司机奖励政策(4月5日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(4月5日)
    百度百科股票教程
    趋势型指标——MACD
    Git和Code Review流程
    nodejs npm常用命令
    win系统下nodejs安装及环境配置
  • 原文地址:https://www.cnblogs.com/Jawen/p/11044214.html
Copyright © 2020-2023  润新知