【实习笔记】UDP 通信

题目

实现一个基于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异常,现掌握知识还无法解决,但对于本次作业要实现的任务影响不大

实现代码参考
代码涉及方法浅参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值