您的位置:首页 > 其它

[Boost]用asio编写简单的socket通信程序

2015-08-27 10:54 190 查看
boost/asio库中封装了很多关于scoket的函数,当然,asio库还包含很多底层的库。
我们可以用socket编写一个基于UDP协议的黑框通讯程序。
要想使用asio里面的函数,大多都需要先创建一个io_service对象,然后通过这个serveice来构造不同的对象,所以第一步,我们得创建两个对象:


boost::asio::io_service io_service;
    boost::asio::ip::udp::socket udp_socket(io_service);


这里唯一需要注意的就是命名空间的使用,两处不同。
创建了一个基于UDP的socket对象,我们还需要给这个对象绑定IP和端口,因为有了这两个参数,程序才能正确的发送接收信息。


boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address::from_string("192.168.0.141"), 2000);


我们创建local_add这个对象,这个对象包含了Ip和端口两个参数,Ip地址我填的是局域网的,如果没有的话可以填127.0.0.1的本机默认地址.创建完成之后,我们就需要,给scoket对象绑定local_add对象


udp_socket.open(local_add.protocol());
    udp_socket.bind(local_add);


open 实现了打开这个Ip的端口,这样我们就可以通过这个端口通信,
bind实现了这个scoket绑定在这个端口,这个参数是区别服务端和客户端区别的地方,服务端需要绑定这个端口来接收所有发送到这个端口的数据,而客户端只需要发送到这个端口,不需要绑定在这个端口。
完成到这里,可以说,一个小型的服务器,就搭建到了本机上,我们还需要完成通讯部分的编写,这里我们就简单的完成,接收一个数据,然后返回这个数据。


char receive_str[1024] = { 0 };
    while (1)
    {
        boost::asio::ip::udp::endpoint  sendpoint;
        udp_socket.receive_from(boost::asio::buffer(receive_str, 1024), sendpoint);
        cout << "收到" << sendpoint.address().to_string() <<":"<< receive_str << endl;
        udp_socket.send_to(boost::asio::buffer("服务端返回success"), sendpoint);
        memset(receive_str, 0, 1024);

    }

    }


sendpoint用来存储收到客户端的ip和端口,receive_from和send_to对应接收这个端口的数据和发送给这个端口。
这样的话,服务端的代码全部编写完成,当然光有一个服务端,并没有什么卵用,我们还需要写一个客户端。之前说过,客户端和服务端的区别在于是否绑定Ip和端口,所以,基本上我们只需要把通信部分的操作改成先发信再接收,就可以了,即:


char receive_str[1024] = { 0 };//字符串
    while (1)
    {
        boost::asio::ip::udp::endpoint  sendpoint;//请求的IP以及端口
        string s;
        cin >> s;
        udp_socket.send_to(boost::asio::buffer(s.c_str(),s.size()), local_add);
        udp_socket.receive_from(boost::asio::buffer(receive_str, 1024), local_add);//收取
        cout << "收到" << receive_str << endl;
        memset(receive_str, 0, 1024);//清空字符串
    }


完成后我们测试一下:
![测试:](http://img.blog.csdn.net/20150827104752519)

最后附上两个源码:
server:


#include <iostream>
using namespace std;
#include <boost/asio.hpp>
//using namespace boost::asio;

void main()
{
boost::asio::io_service io_service; boost::asio::ip::udp::socket udp_socket(io_service);
boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address::from_string("192.168.0.141"), 2000);

udp_socket.open(local_add.protocol()); udp_socket.bind(local_add);

char receive_str[1024] = { 0 };
while (1)
{
boost::asio::ip::udp::endpoint sendpoint;
udp_socket.receive_from(boost::asio::buffer(receive_str, 1024), sendpoint);
cout << "收到" << sendpoint.address().to_string() <<":"<< receive_str << endl;
udp_socket.send_to(boost::asio::buffer("服务端返回success"), sendpoint);
memset(receive_str, 0, 1024);

}
}


client:

#include <iostream>
using namespace std;
#include <boost/asio.hpp>
//using namespace boost::asio;

void main()
{
boost::asio::io_service io_service; boost::asio::ip::udp::socket udp_socket(io_service);
boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address::from_string("192.168.0.141"), 2000);

udp_socket.open(local_add.protocol());

char receive_str[1024] = { 0 };//字符串 while (1) { boost::asio::ip::udp::endpoint sendpoint;//请求的IP以及端口 string s; cin >> s; udp_socket.send_to(boost::asio::buffer(s.c_str(),s.size()), local_add); udp_socket.receive_from(boost::asio::buffer(receive_str, 1024), local_add);//收取 cout << "收到" << receive_str << endl; memset(receive_str, 0, 1024);//清空字符串 }
}


如果在server端添加system(“str”);的命令行功能,就实现了最简单的远控程序,有兴趣的可以试试。


需要boost库静态库,编译不通过的 可以百度boost lib编译方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: