用c++写出客户端和服务端代码利用udp协议引入txt文档进行机器人一问一答,而不是直接把文档的所有内容打印出来。
时间: 2024-01-24 17:17:25 浏览: 25
以下是基于 UDP 协议的 C++ 客户端和服务端代码实现机器人一问一答,从文本文件中读取问题和答案:
服务端代码:
```c++
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
using namespace std;
#define PORT 8888
#define MAXSIZE 1024
int main()
{
// 打开文件
ifstream file("qa.txt");
if (!file.is_open()) {
cerr << "Failed to open file." << endl;
return -1;
}
// 读取文件内容
string line;
string question;
string answer;
while (getline(file, line)) {
if (line.empty()) {
continue;
}
if (line[0] == '#') {
if (!question.empty() && !answer.empty()) {
cout << "Q: " << question << endl;
cout << "A: " << answer << endl;
cout << endl;
question = "";
answer = "";
}
question = line.substr(1);
} else {
answer += line;
}
}
// 创建 socket
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 设置服务器地址
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = INADDR_ANY;
// 绑定 socket
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 接收客户端消息并回复
char buffer[MAXSIZE];
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);
while (true) {
memset(buffer, 0, sizeof(buffer));
int n = recvfrom(sockfd, (char *)buffer, MAXSIZE, MSG_WAITALL, (struct sockaddr *)&clientaddr, &len);
buffer[n] = '\0';
cout << "Received client message: " << buffer << endl;
if (strcmp(buffer, "exit") == 0) {
break;
}
string reply = answer.empty() ? "Sorry, I don't know." : answer;
sendto(sockfd, reply.c_str(), reply.length(), MSG_CONFIRM, (const struct sockaddr *)&clientaddr, len);
}
// 关闭 socket
close(sockfd);
return 0;
}
```
客户端代码:
```c++
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
using namespace std;
#define PORT 8888
#define MAXSIZE 1024
int main()
{
// 创建 socket
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 设置服务器地址
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = INADDR_ANY;
// 发送消息给服务器
char buffer[MAXSIZE];
struct sockaddr_in serv_addr;
socklen_t len = sizeof(serv_addr);
while (true) {
cout << "Please input your question: ";
cin.getline(buffer, MAXSIZE);
sendto(sockfd, buffer, strlen(buffer), MSG_CONFIRM, (const struct sockaddr *)&servaddr, len);
if (strcmp(buffer, "exit") == 0) {
break;
}
memset(buffer, 0, sizeof(buffer));
int n = recvfrom(sockfd, (char *)buffer, MAXSIZE, MSG_WAITALL, (struct sockaddr *)&serv_addr, &len);
buffer[n] = '\0';
cout << "Answer: " << buffer << endl;
}
// 关闭 socket
close(sockfd);
return 0;
}
```
注意,在运行服务端程序之前,需要创建一个名为 “qa.txt” 的文本文件,并按照以下格式填写问题和答案:
```
# Question 1
Answer 1.
# Question 2
Answer 2.
...
```
其中,“#” 后面的内容为问题,接下来的内容为答案。每个问题和答案之间需要用空行分隔开。