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编译方法。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 12:34:14