shangguanwaner的专栏

套接字 Sockets

Boost.Asio有三种类型的Socket类:ip::tcp,ip::udp和ip::icmp,三者都是可扩展的。你可以创建自己的Socket类,,虽然做起来稍微复杂了点。假如你真的要这么做,可以参考boost/asio/ip/tcp.hpp,boost/asio/ip/udp.hpp和boost/asio/ip/icmp.hpp。它们都是很小的类,在内部使用typedef关键字。 你可以把ip::tcp,ip::udp和ip::icmp类,作为一个占位符;可以用下面的形式来访问类的和类的方法:

相应的socket类创建一个对应的套接字。在io_service实例构造的时候,你需要传入这个socket:

io_service service;sock(service);sock.set_option((true));

每一个socket的名字都由typedef而来:

同步错误代码(Synchronous error codes)

所有的同步函数都有例外情况,它们会抛出异常或者返回一个错误代码,例如下列代码:

sync_func(arg1, arg2 … argN); //抛出异常boost::system::error_code ec;sync_func(arg1 arg2, … , argN, ec); //返回错误代码

在后面,会遇到很多同步函数。为了保持简洁,后面会忽略返回错误代码的例外情况。

Socket成员函数

这些函数被分为几个组。并不是每个种类的socket都能访问所有这些成员函数。本节的最后,会有一张表列出哪些成员是隶属于何种socket类。 需要注意的是,所有的异步函数都是立即返回的,而同步版本的函数,只在操作完成之后才返回。

连接相关的类

有些函数用于连接或者绑定socket,断开连接,查询连接是否有效:

cancel():取消socket上的所有异步操作。所有在此socket上的异步操作都会被立即完成,并以error::operation_aborted错误代码返回。 下面是例子:ep((“127.0.0.1”), 80);sock(service);sock.open(());sock.connect(ep);sock.write_some(buffer(“GET /index.html\r\n”));char buff[1204];sock.read_some(buffer(buff, 1024));sock.shutdown();sock.close();读/写函数

读写函数在socket上进行I/O操作。 对于异步函数,handler是一个回调函数,形如void handler(const boost::system::error_code& e, size_t bytes)。

这里简单讨论下缓冲区。默认的flags参数是0,也可以混合下面的值:

大多数时候我们都使用message_peek,例子如下:

char buff[1024];sock.receive(buffer(buff), ip::tcp::socket::message_peek);memset(buff, 1024, 0);//重新读取上次读取过的数据sock.receive(buffer(buff));

下面的例子演示了同步和异步的区别:

例子1,在tcp socket上同步的写和读:ep((“127.0.0.1”, 80);sock(service);sock.connect(ep);sock.write_some(buffer(“GET /index.html\r\n”);<< sock.available() <<std::endl;char buff[512];size_t read = sock.read_some(buffer(buff));例子2,在UDP socket上异步读和写:sock(service);sock.open(());receiver_ep(“xxx.xxx.xxx.xxx”, 80);sock.send_to(buffer(“testing\n”), receiver_ep);char buff[512];sender_ep;sock.receive_from(buffer(buff), sender_ep);例子3,从UDP服务器socket中异步读取:using namespace boost::asio;io_service service;sock(service);sender_ep;char buff[512];void on_read(const err, std::size_t read_bytes) {;sock.async_receive_from(buffer(buff), sender_ep, on_read);}int main(int argc, char** argv){ep((“127.0.0.1”), 8001);sock.open(ep.protocol());sock.set_option((true));sock.bind(ep);sock.async_receive_from(buffer(buff, 512), sender_ep, on_read);service.run();return 0;}

沿途跟着一条河,你看着它在晨光暮霭中变换着色彩,

shangguanwaner的专栏

相关文章:

你感兴趣的文章:

标签云: