Loading... 在 Linux 环境中,我们可以使用 C 语言实现一个简单的基于 TCP 的英译汉程序。该程序将包含一个客户端和一个服务器端。服务器接收客户端发送的英文词汇,并返回其对应的中文翻译。为了简单起见,我们将模拟一个静态的词典。 ### 一、程序设计概述 1. **服务器端**:负责监听客户端请求,接收客户端发送的英文单词,并返回对应的中文翻译。 2. **客户端**:向服务器发送英文单词,并接收服务器返回的中文翻译结果。 ### 二、所需的 Linux 网络编程库 - `sys/socket.h`: 提供创建套接字、连接等基本功能。 - `arpa/inet.h`: 包含地址转换函数,处理 IPv4 地址。 - `netinet/in.h`: 提供 `sockaddr_in` 结构体,用于存储 IP 地址和端口信息。 - `unistd.h`: 提供 `read`、`write`、`close` 等系统调用函数。 ### 三、服务器端程序实现 #### 3.1 服务器端代码 ```c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #define PORT 8080 #define BUFFER_SIZE 1024 // 模拟英汉词典 const char *translate(const char *word) { if (strcmp(word, "hello") == 0) { return "你好"; } else if (strcmp(word, "world") == 0) { return "世界"; } else if (strcmp(word, "apple") == 0) { return "苹果"; } else { return "未知词汇"; } } int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定 IP 和端口 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听客户端连接 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } printf("服务器启动,等待客户端连接...\n"); // 接受客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } while (1) { // 清空缓冲区 memset(buffer, 0, BUFFER_SIZE); // 读取客户端发送的单词 int valread = read(new_socket, buffer, BUFFER_SIZE); if (valread > 0) { printf("接收到单词: %s\n", buffer); // 获取翻译 const char *translation = translate(buffer); // 发送翻译结果给客户端 send(new_socket, translation, strlen(translation), 0); printf("翻译发送: %s\n", translation); } else { break; } } close(new_socket); close(server_fd); return 0; } ``` #### 3.2 服务器端代码解析 - `socket`: 创建一个用于 TCP 通信的套接字。 - `bind`: 绑定服务器的 IP 和端口。 - `listen`: 使服务器进入监听状态,等待客户端的连接请求。 - `accept`: 接受客户端连接,并返回新的套接字用于通信。 - `read`: 从客户端读取数据。 - `send`: 将翻译结果发送给客户端。 - `translate`: 一个模拟的词典函数,用于将英文单词翻译为中文。 ### 四、客户端程序实现 #### 4.1 客户端代码 ```c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sock = 0; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE] = {0}; char word[BUFFER_SIZE]; // 创建套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("Socket 创建失败\n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将 IP 地址转换为二进制形式 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("IP 地址无效\n"); return -1; } // 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("连接服务器失败\n"); return -1; } while (1) { printf("输入英文单词: "); fgets(word, BUFFER_SIZE, stdin); word[strcspn(word, "\n")] = 0; // 去除换行符 // 发送单词给服务器 send(sock, word, strlen(word), 0); // 清空缓冲区 memset(buffer, 0, BUFFER_SIZE); // 接收服务器返回的翻译 int valread = read(sock, buffer, BUFFER_SIZE); if (valread > 0) { printf("翻译结果: %s\n", buffer); } else { printf("服务器断开连接\n"); break; } } close(sock); return 0; } ``` #### 4.2 客户端代码解析 - `socket`: 创建一个 TCP 套接字。 - `connect`: 连接到服务器的指定 IP 和端口。 - `send`: 将输入的英文单词发送到服务器。 - `read`: 接收来自服务器的翻译结果并显示给用户。 ### 五、程序运行步骤 #### 5.1 编译 将服务器端和客户端程序分别保存为 `server.c` 和 `client.c`,然后使用 `gcc` 编译: ```bash gcc server.c -o server gcc client.c -o client ``` #### 5.2 运行服务器 首先启动服务器程序: ```bash ./server ``` 服务器将开始监听来自客户端的连接请求。 #### 5.3 运行客户端 在服务器启动后,启动客户端程序: ```bash ./client ``` 在客户端输入一个英文单词,程序将返回对应的中文翻译。 ### 六、总结 本文实现了一个简单的基于TCP的英译汉通信程序。通过该程序,客户端可以向服务器发送英文单词,服务器根据内置的词典返回对应的中文翻译。在Linux环境下,TCP通信是高效且常用的网络通信方式,本文通过使用 `socket`、`bind`、`connect` 等基础API,展示了如何进行基本的TCP通信。 最后修改:2024 年 09 月 16 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏