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('\n', 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>\n", 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("连接成功!\n"); 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\n", message); 55 return 0; 56 } 57 void error_handling(char *message) 58 { 59 fputs(message, stderr); 60 fputc('\n', stderr); 61 exit(1); 62 }