回声客户端的完美实现

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 }
原文地址:https://www.cnblogs.com/Jawen/p/11044214.html