注意一点:当我们不同PC机间进行通信的时候,IP和端口号是不一样的。之前遇到的问题是,boost_system_error,这是因为我们在写程序的时候,发送和接收绑定了同一个端口,导致程序出错。
/*
* Copyright (c) 2015,北京智行者科技有限公司
* All rights reserved.
*
* 文件名称:Boost_UDP.h
* 文件标识:见软件框架协议
* 摘 要:UDP读写类
*
* 当前版本:1.0
* 作 者:zhuxuekui
* 完成日期:2015年11月30日
* 修 改:
*
* 取代版本:1.0
* 原作者 :zhuxuekui
* 完成日期:2015年11月30日
*/
?
#ifndef BOOST_UDP_H
#define BOOST_UDP_H
?
#include "Utils.h"
?
using
namespace boost;
?
#define RECVSIZE 1024
class Boost_UDP
{
public:
?
???Boost_UDP(boost::asio::io_service &io_service,string pcIP, int pcPort, string canetIP, int canetPort):udp_sock(io_service)
???{
???????m_canetIP = canetIP;
??????m_canetPort = canetPort;
??????m_pcIP = pcIP;
??????m_pcPort = pcPort;
???}
?
???~Boost_UDP()
???{
??????udp_sock.close();
???}
?
???//开始socket,绑定端口等。 绑定PC机端口号,而且还不能用 127.0.0.1, 不然会出错,很奇怪的原因。
???void start_sock()
???{
??????// here the ip can change to 192.168.1.33
???????boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address_v4::from_string(m_pcIP),m_pcPort);
??????udp_sock.open(local_add.protocol());
??????udp_sock.bind(local_add);
???}
?
???//收数据
???int receive_data(unsigned char buf[])
???{
??????boost::mutex::scoped_lock lock(mutex);
???????//donot change 目的端口与发送端口现在是不一样的
???????boost::asio::ip::udp::endpoint send_endpoint(boost::asio::ip::address_v4::from_string(m_pcIP),m_pcPort); //这里的endpoint是PC机的IP和端口号
???????int ret = udp_sock.receive_from(boost::asio::buffer(buf,RECVSIZE),send_endpoint);//堵塞模式
??????return ret;
???}
?
???//发送数据
???int send_data(unsigned char str[], int len)
???{
??????boost::mutex::scoped_lock lock(mutex);
??????//donot change
??????boost::asio::ip::udp::endpoint send_endpoint(boost::asio::ip::address_v4::from_string(m_canetIP),m_canetPort); //canet的IP和端口号
??????int ret = udp_sock.send_to(boost::asio::buffer(str,len),send_endpoint);
??????return ret;
???}
public:
?
???string m_canetIP;
???int m_canetPort;
???string m_pcIP;
???int m_pcPort;
?
???boost::asio::ip::udp::socket udp_sock;
???mutable boost::mutex mutex;
?
};
?
?
#endif