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

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

[Boost]用asio编写简单的socket通信程序的相关文章

C# 如何实现简单的Socket通信(附示例)

上周由于有个项目需要用到网络通信这块,然后就花了点时间研究了一下,本来想上周就写出来的,但是突然要忙,所以等到现在. 话说对于网络通信,以前写C++的时候,天天面对着线程和Socket,所以换成C#也就没那么怕了,虽然C++下也没有掌握的多好,但毕竟只是一个小Demo,只作为了解一下过程. 自己写了一个服务端和一个客户端,刚开始比较简单,只是能达到连通,收发信息的目的,但是很粗糙.而后稍加改进呢~加上了多线程,所以能感觉更科学一些,不过自己真的很菜,代码写的不是很好看,下面分两个版本给大家表出来

一个最简单的Socket通信例子

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.  Socket和ServerSocket类库位于java.net包中.ServerSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别.不管是

简单的socket通信

//client#include <iostream> #include <WinSock2.h> #pragma comment(lib, "WS2_32") // 链接到WS2_32.lib using namespace std; int main() { SOCKET so; WSADATA ws; if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) { cout << "WSAStartup

Linux下简单的socket通信实例

Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Bruce Lee       学习网络编程也一段时间了,刚开始看<UNIX网络编程>的时候,觉得这本厚厚的书好难啊!看到后来,发现并没有想象中的那么难.如果你是新手,建议你看到第二部分结束后,开始着手写代码.不写代码肯定是不行的.看100遍也没有敲一遍实现一遍来的清楚.敲完以后,带着问题去看书,你会

VC++编写简单串口上位机程序

转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面.写上位机程序的编程语言.编译环境等不少,VB.C#.LABVIEW等等,我会的语言很 少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相 当蹩脚的C++写出了一个简单的串口上位机程序,分享一下

用Python编写简单的发红包程序和计算器原理

用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成分为单位 ret = random.sample(range(1,money),num-1) #在最低钱数1分与总钱数之间生成人数减1个数作为数轴的节点 ret.sort() #对列表进行排序 ret.insert(0,0) ret.append(money) for i in range(len(

简单介绍Socket通信

java Socket通信(一) 标签: socketjavaexceptionstring服务器class 版权声明:本文为博主原创文章,未经博主允许不得转载. Java socket通信已经被封装好了主要使用两个类ServerSocket 和Socket 首先写一个1v1的通信 服务端 [java] view plain copy /** * */ package com.dnion.socket; import java.io.BufferedReader; import java.io.

Java实现简单的socket通信

今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有package的类,不过最后问题基本都解决了,把代码贴出来供大家参考 server public class TcpServer { public static void main(String[] args) throws Exception { ServerSocket server = new S

一个简单的socket通信小demo

写了一个socket的程序,可以和本地的服务器进行通信,要先和服务器建立链接,然后发送登录信息,验证成功,就可以和服务器通信了 1 页面截图 2 点击链接服务器,可以链接服务器,服务器的ip地址为:127.0.0.1 端口为 12345: 3 点击链接服务器之后,打印信息如下 4 点击登录,会向服务器发送登录信息: iam:zhangsan, 然后会客户端会显示登录成功 5 比如输入chongqingyoudian  6 在服务器控制台就能看到客户端发送的信息 客户端代码如下 1 // 2 //