题目
实现一个基于boost.asio库基于UDP通信的客户端和服务端。
1)客户端发送字符串数据到服务端。
2)服务端将原字符串带上服务器的IP组成新字符串返回给客户端。
实现代码
server.cpp
#include <string>
#include <boost/asio.hpp>
#include <iostream>
#include <tchar.h>
using namespace std;
using namespace boost::asio;
int _tmain(int argc, _TCHAR* argv[])
{
const char* my_ip = " 127.0.0.1"; // 服务器ip
io_service my_io_service;
ip::udp::endpoint local_endpoint(ip::address_v4::from_string(my_ip), 2300);// 创建本地端点
ip::udp::endpoint remote_endpoint; //记录远程端点
ip::udp::socket socket(my_io_service, local_endpoint);// 创建套接字并并连接本地端点
char buffer[40000];
memset(buffer, 0, 40000); // 初始化
socket.receive_from(boost::asio::buffer(buffer, 40000), remote_endpoint);// 接收数据
cout << buffer << endl;
string s(&buffer[0], &buffer[strlen(buffer)]); // char类型转换为string
string sen_ = s + my_ip; // 字符串拼接
socket.send_to(boost::asio::buffer(sen_, sen_.length() + 1), remote_endpoint); //发数据
return 0;
}
client.cpp
#include <string>
#include <boost/asio.hpp>
#include <tchar.h>
#include <iostream>
using namespace std;
using namespace boost::asio;
int _tmain(int argc, _TCHAR* argv[])
{
//const char* send_data;
const char* send_data = (char*)malloc(sizeof(send_data));// 发送内容
scanf_s("%s", send_data);
io_service my_io_service;
// 另一种创建端点方式
// ip::udp::endpoint my_local_enpoint(ip::udp::v4(),0);
// my_udp_socket.open(my_login_server_endpoint.protocol());
// my_udp_socket.bind(my_local_enpoint);
ip::udp::endpoint local_endpoint(ip::udp::v4(), 7777);// 创建本地端点
ip::udp::endpoint remote_endpoint(ip::address_v4::from_string("127.0.0.1"), 2300);// 创建远程端点
// 注意第一个参数不要填 (ip::udp::v4())
ip::udp::socket socket(my_io_service, local_endpoint);// 创建套接字并并连接本地端点
char rec_[40000];
try
{
memset(rec_, 0, 40000);
socket.send_to(buffer(send_data, strlen(send_data) + 1), remote_endpoint);
socket.receive_from(buffer(rec_, 40000), remote_endpoint);
cout << rec_ << endl;
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
遇到的问题
错误 LNK2005 main 已经在 Text.obj 中定义 Text
错误 LNK1169 找到一个或多个多重定义的符号 Text
【解决方法】
两个cpp文件放在同一个项目,编译器编译一个cpp文件时无法利用头文件调用另一个cpp文件报错,另建一个项目即可
错误 MSB6006 “link.exe”已退出,代码为 1104
错误 LNK1104 无法打开文件“kernel32.lib”
【解决方法】使用boost库时平台选的不是活动的,更换一下即可
实现出的效果
如图服务器会抛出wrapexcept异常,现掌握知识还无法解决,但对于本次作业要实现的任务影响不大