用c语言中写出客户端和服务端代码利用udp协议引入txt文档进行机器人一问一答,而不是直接把文档的所有内容打印出来。
时间: 2024-01-22 07:19:05 浏览: 106
C语言编写的、用UDP传送的客户、服务端
3星 · 编辑精心推荐
以下是一个简单的基于UDP协议的机器人一问一答的客户端和服务端代码示例,其中引入了一个txt文档:
服务端代码(server.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_LINE 1024
#define SERVER_PORT 8000
int main(int argc, char *argv[]) {
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
int server_sockfd, client_sockfd;
char buf[MAX_LINE];
FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t read;
// 创建套接字
server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
// 绑定套接字
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
while (1) {
client_len = sizeof(client_addr);
// 接收客户端发送的消息
recvfrom(server_sockfd, buf, MAX_LINE, 0, (struct sockaddr *)&client_addr, &client_len);
printf("Received from client: %s\n", buf);
// 打开txt文档
fp = fopen("qa.txt", "r");
if (fp == NULL) {
printf("Fail to open the file!\n");
exit(1);
}
// 逐行读取txt文档
while ((read = getline(&line, &len, fp)) != -1) {
// 如果读取到了对应问题的行,则回复对应答案
if (strncmp(line, buf, strlen(buf)) == 0) {
sendto(server_sockfd, line + strlen(buf) + 1, strlen(line) - strlen(buf) - 1, 0, (struct sockaddr *)&client_addr, client_len);
break;
}
}
// 如果没有找到对应问题,则回复"Sorry, I can't answer that."
if (read == -1) {
sendto(server_sockfd, "Sorry, I can't answer that.", 27, 0, (struct sockaddr *)&client_addr, client_len);
}
fclose(fp);
}
return 0;
}
```
客户端代码(client.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_LINE 1024
#define SERVER_PORT 8000
int main(int argc, char *argv[]) {
struct sockaddr_in server_addr;
int sockfd;
char buf[MAX_LINE];
socklen_t server_len;
ssize_t n;
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
// 设置服务端地址
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
server_addr.sin_port = htons(SERVER_PORT);
server_len = sizeof(server_addr);
while (1) {
printf("Please enter your question: ");
// 从标准输入读取用户输入的问题
fgets(buf, MAX_LINE, stdin);
buf[strlen(buf) - 1] = '\0';
// 发送问题给服务端
sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, server_len);
// 接收服务端回复的答案
n = recvfrom(sockfd, buf, MAX_LINE, 0, NULL, NULL);
buf[n] = '\0';
printf("Answer from server: %s\n", buf);
}
return 0;
}
```
在这个示例中,我们假设有一个qa.txt文档,其中包含了一些问题和对应的答案,每个问题和答案都占据一行,用":"隔开。例如:
```
你叫什么名字:我叫小明。
你几岁了:我今年3岁。
你喜欢什么颜色:我喜欢红色。
```
当客户端发送一个问题给服务端时,服务端会逐行读取qa.txt文档,找到对应问题行的答案并回复给客户端。如果没有找到对应问题,则回复"Sorry, I can't answer that."。
阅读全文