900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > TCP/IP网络编程:计算器服务器端/客户端

TCP/IP网络编程:计算器服务器端/客户端

时间:2022-12-22 22:12:45

相关推荐

TCP/IP网络编程:计算器服务器端/客户端

刚接触网络编程,看到计算器端/客户端练习,作者建议读者自己实现一下。自己就头痛医头,脚痛医脚,写了一个很初级的服务器端、客户端,虽然很菜,不过功能是实现了,还是很开心的,记录一下。

要求:客户端依次发送待算数字个数,以及相应个数的整数,最后输入运算符(+、-、*之一),服务器端计算运算结果并返回给客户端,客户端输出结果。

// 服务器端#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>void error_handling(const char *);int main(int argc, char* argv[]){int serv_sock;int clnt_sock;struct sockaddr_in serv_addr;struct sockaddr_in clnt_addr;socklen_t clnt_addr_len;char message[100]; int num = 0; // 记录传过来的字符串个数char ch[10][10]; // 用来接收每一个操作数和运算符int sum = 0; // 计算最后的结果int n; // 记录有几个操作数if (argc != 2){printf("Usage: %s <port>\n", argv[0]);exit(1);}serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 创建服务端套接字if (serv_sock == -1){error_handling("socket() error!");}memset(&serv_addr, 0, sizeof(struct sockaddr_in)); // 设置IP port 协议族serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);serv_addr.sin_port = htons(atoi(argv[1]));// 分配 IPif (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1){error_handling("bind() error!");}//等待连接if (listen(serv_sock, 5) == -1){error_handling("listen() error!");}clnt_addr_len = sizeof(clnt_addr);// 连接客户端clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_len);if (clnt_sock == -1){error_handling("accept() error!");}memset(ch, 0, 100); // 初始化接收字符串的数组memset(message, 0, 100); // 初始化接收的bufferread(clnt_sock, message, 100);n = atoi(message); // 记录操作数个数memset(message, 0, 100);while (n >= 0) //用字符串数组把操作数和运算符以字符串形式接收{read(clnt_sock, message, 100);strcpy(ch[num], message);memset(message, 0, 100);num++;n--;}// 将操作数的字符串转为整数,进行计算if (ch[num-1][0] == '+'){for (int i = 0; i < num-1; i++){sum += atoi(ch[i]);}} else if (ch[num-1][0] == '*') {sum = 1;for (int i = 0; i < num-1; i++){sum = sum * atoi(ch[i]);}} else if (ch[num-1][0] == '-') {sum = atoi(ch[0]);for (int i = 0; i < num - 2; i++) {sum -= atoi(ch[i+1]); }}write(clnt_sock, &sum, sizeof(&sum)); // 把结果以int的形式传过去close(clnt_sock);close(serv_sock);return 0;}void error_handling(const char message[]){fputs(message, stderr);fputc('\n', stderr);exit(1);}

// 客户端#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>void error_handling(const char *);#define BUF_SIZE 1024int main(int argc, char* argv[]){int sock;struct sockaddr_in serv_addr;char buf[BUF_SIZE];int num;int rev;if (argc != 3){printf("Usage: %s <port>\n", argv[0]);exit(1);}sock = socket(PF_INET, SOCK_STREAM, 0);if (sock == -1){error_handling("socket() error!");}memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr(argv[1]);serv_addr.sin_port = htons(atoi(argv[2]));if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1){error_handling("connect() error!");}else {puts("Connecting.........");}memset(buf, 0, BUF_SIZE);fputs("Operand count: ", stdout);scanf("%s", buf);write(sock, buf, strlen(buf));printf("%d\n", num);memset(buf, 0, BUF_SIZE);for (int i = 0; i < num; i++){printf("Operand %d: ", i + 1);scanf("%s", buf);write(sock, buf, strlen(buf));memset(buf, 0, BUF_SIZE);}printf("Operator: ");scanf("%s", buf);write(sock, buf, 1);memset(buf, 0, BUF_SIZE);if (read(sock, &rev, sizeof(int)) == -1) { // 以int形式接收计算结果printf("read() error!");}printf("Operation result: %d", rev);close(sock);return 0;}void error_handling(const char message[]){fputs(message, stderr);fputc('\n', stderr);exit(1);}

运行结果:

Connecting.........Operand count: 3Operand 1: 12Operand 2: 24Operand 3: 36Operator: +Operation result: 72

Connecting.........Operand count: 2Operand 1: 12Operand 2: 24Operator: -Operation result: -12

Connecting.........Operand count: 3Operand 1: 12Operand 2: 24Operand 3: 36Operator: *Operation result: 10368

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。