1、C+POCO库中文编程C+POCO库中文编程1 What is POCO?POCO 是什么?这是我最常被人问到的。POCO 是 POrtable COmponents 的缩写,官方主页:POCOProject.org。是一个十分超卓的 C+ 库,相当于 Java 的 Class Library、.NET 的 Framework 和 Apple 的 Cocoa。它与 Boost 是十分不一样的,简单说 Boost 即是相当于 Advanced STL。2 本系列文章所运用的 POCO 版别POCO C+ Library 1.4.3p1 (2012-01-23)3 库逻辑布局下图摘自 POCO 官
2、网。OS API 是运用操作系统层的,C+/C Standard Libararies 是规范库,其他的模块都是 POCO 所供给的,包含:Foundation、XML、Crypto、XML、Util、Net、Zip、NetSSL、Data(撑持 SQLite、ODBC、MySQL)、Tools & Utilities、Application。 4 撑持渠道Desktop/Server: - Windows - Linux - Mac OS X - Solaris - HP-UX - AIXEmbedded: - Windows Embedded CE - Embedded Linux (uC
3、libc or glibc) - iOS - QNX - VxWorks - Android5 NamespacesPocoPoco:CryptoPoco:DataPoco:Data:MySQLPoco:Data:ODBCPoco:Data:SQLitePoco:NetPoco:UtilPoco:Util:UnitsPoco:Util:Units:ConstantsPoco:Util:Units:InternalPoco:Util:Units:ValuesPoco:XMLPoco:ZipC+ POCO库中文编程参阅攻略(2) 根本数据类型(Poco/Types.h)根本类型在Poco/Type
4、s.h头文件中。以下以 GNU C/C+ 和 CLang 为例。不 过要着重的是,POCO 有极好的跨渠道性,你能想到的渠道,简直都能够运转 POCO。1 有符号整型typedef signed char Int8;typedef signed short Int16;typedef signed int Int32;2 无符号整型typedef unsigned char UInt8;typedef unsigned short UInt16;typedef unsigned int UInt32;3 Pointer or Handlertypedef signed long IntPtr;
5、typedef unsigned long UIntPtr;4 64 位整型思考了 32 位机和 64 位机的状况#if defined(_LP64_) #define POCO_PTR_IS_64_BIT 1 #define POCO_LONG_IS_64_BIT 1 typedef signed long Int64; typedef unsigned long UInt64; #else typedef signed long long Int64; typedef unsigned long long UInt64; #endif #define POCO_HAVE_INT64 1C+
6、 POCO库中文编程参阅攻略(3) Poco:Net:Socket1 SelectModeenum SelectMode / The mode argument to poll() and select(). SELECT_READ = 1, SELECT_WRITE = 2, SELECT_ERROR = 4 ;2 SocketListtypedef std:vectorSocketList;3 布局函数未初始化的 socket:Socket ();复制布局函数Socket(const Socket& socket);4 重载运算符赋值运算符:Socket& operator = (cons
7、t Socket& socket);对比运算符:bool operator =(const Socket& socket) const; bool operator != (const Socket& socket) const; bool operator (const Socket& socket) const; bool operator (const Socket& socket) const; bool operator = (const Socket& socket) const;5 常用 socket 操作回来该 socket 的可读数据的字节数,该操作不导致 socket 堵塞
8、:int available() const;封闭 socket:void close();poll:bool poll(constPoco:Timespan& timeout, int mode) const; / Determines the status of the socket, using a / call to select(). / / The mode argument is constructed by combining the values / of the SelectMode enumeration. / / Returns true if the next ope
9、ration corresponding to / mode will not block, false otherwise. SocketImpl* impl() const; / Returns the SocketImpl for this socket.查看这个 socket 的衔接是不是是安全的(运用 SSL 或 TLS):bool secure() const;6 缓冲区发送数据的缓冲区:void setSendBufferSize(int size);int getSendBufferSize() const;接 收数据的缓冲区:void setReceiveBufferSize
10、(int size);int getReceiveBufferSize() const;7 超不时刻发送数据的超不时 间:void setSendTimeout(const Poco:Timespan& timeout);Poco:Timespan getSendTimeout() const;接纳数据的超 不时刻:void setReceiveTimeout(const Poco:Timespan& timeout);Poco:Timespan getReceiveTimeout() const;8 其他接口void setOption(int level, int option, int
11、value); void setOption(int level, int option, unsigned value); void setOption(int level, int option, unsigned char value); void setOption(int level, int option, const Poco:Timespan&value); void setOption(int level, int option, const IPAddress& value); void getOption(int level, int option, int& value
12、) const; void getOption(int level, int option, unsigned& value) const; void getOption(int level, int option, unsigned char& value) const; void getOption(int level, int option, Poco:Timespan& value)const; void getOption(int level, int option, IPAddress& value) const; void setLinger(bool on, int secon
13、ds); void getLinger(bool& on, int& seconds) const; void setNoDelay(bool flag); bool getNoDelay() const; void setKeepAlive(bool flag); bool getKeepAlive() const; void setReuseAddress(bool flag); bool getReuseAddress() const; void setReusePort(bool flag); bool getReusePort() const; void setOOBInline(b
14、ool flag); bool getOOBInline() const; void setBlocking(bool flag); bool getBlocking() const;获取 socket 的 IP 和端口:SocketAddress address() const;获取 peer socket 的 IP 地 址和端口:SocketAddress peerAddress() const;9 静态函数select:static int select(SocketList& readList, SocketList& writeList, SocketList& exceptList
15、, const Poco:Timespan& timeout); / Determines the status of one or more sockets, / using a call to select(). / / ReadList contains the list of sockets which should be / checked for readability. / / WriteList contains the list of sockets which should be / checked for writeability. / / ExceptList cont
16、ains a list of sockets which should be / checked for a pending error. / / Returns the number of sockets ready. / / After return, / * readList contains those sockets ready for reading, / * writeList contains those sockets ready for writing, / * exceptList contains those sockets with a pending error.
17、/ / If the total number of sockets passed in readList, writeListand / exceptList is zero, select() will return immediately and the / return value will be 0. / / If one of the sockets passed to select() is closed while / select() runs, select will return immediately. However, / the closed socket will
18、 not be included in any list. / In this case, the return value may be greater than the sum / of all sockets in all list.查看是不是撑持 IPv4 或 IPv6 :static bool supportsIPv4();static bool supportsIPv6 ();C+ POCO库中文编程参阅攻略(4) Poco:Net:IPAddress1 Poco:Net:IPAddress地址最大长度,IPv4 是 in_addr 的长度, IPv6 是 in6_addr 的长度
19、enum MAX_ADDRESS_LENGTH = #if defined(POCO_HAVE_IPv6) sizeof(struct in6_addr) #else sizeof(struct in_addr) #endif / Maximum length in bytes of a socket address. ;1.1 IPv4 or IPv6?POCO 用一个枚举类来表明:enum Family / Possible address families for IP addresses. IPv4, IPv6 ;1.2 布局函数回来一个全 0 的 IP 地址:IPAddress();
20、复制布局函数:IPAddress(const IPAddress& addr);依据 IP 类型(IPv4 或 IPv6)创立一个全 0 的 IP 地址:explicit IPAddress(Family family);用字符串类 型的 IPv4 地址或 IPv6 地址来创立一个 IP 地址,其间 IPv4 是十进制表明的 ,IPv6 是十六进制表明的:explicit IPAddress(const std:string& addr);用字符串类型的 IP 地址和指定的类型(IPv4 或 IPv6)创立一个 IP 地址,其间 IPv4 是十进制表明的,IPv6 是十六进制表 示的:IPAd
21、dress(const std:string& addr, Family family);用原生 IP 地址 in_addr 或 in6_addr 数据布局和给定的字符 串长度,创立一个 IPAddress:IPAddress(const void* addr, poco_socklen_t length);用原生 IP 地址 in_addr 或 in6_addr 数据 布局和给定的字符串长度,创立一个 IPAddress,其间 scope 参数用于 IPv6, IPv4 会疏忽这个参数:IPAddress(const void* addr, poco_socklen_t length, Po
22、co:UInt32 scope);1.3 重载运算符赋值运算符:IPAddress& operator = (const IPAddress& addr);比 较运算符bool operator = (const IPAddress& addr) const; bool operator != (const IPAddress& addr) const; bool operator (const IPAddress& addr) const; bool operator (const IPAddress& addr) const; bool operator = (const IPAddres
23、s& addr) const;1.4 常 用操作swap:void swap(IPAddress& address);获 取地址类型:Family family() const;IPv6 专用函数,回来 scope identifier,如果是 IPv4 则回来 0:Poco:UInt32 scope() const;toString,IPv4 则显现“d.d.d.d”,IPv6 则std:string toString() const; poco_socklen_t length() const; const void* addr() const; int af() const; void
24、mask(const IPAddress& mask); void mask(const IPAddress& mask, const IPAddress& set); static IPAddress parse(const std:string& addr); static bool tryParse(const std:string& addr, IPAddress&result); static IPAddress wildcard(Family family = IPv4); static IPAddress broadcast();1.5 IS 函数1.5.1 是不是是未初始 化状
25、况是不是是未初始化的全零状况(wildcard):bool isWildcard() const;1.5.2 是不是是播送/组播/单播是不是是播送 地址(全零),与 wildcard 的区别是 wildcard 是未通过初始化的。只要 IPv4 有播送地址,IPv6 则回来 false。bool isBroadcast() const;是不是是回环地址: 关于 IPv4 是 127.0.0.1关于 IPv6 是:1函数原型:bool isLoopback() const;是不是是多播: 关于 IPv4 是224.0.0.0到 239.255.255.255规模;关于 IPv6 是FFxx:x:
26、x:x:x:x:x:x的规模:函数原型:bool isMulticast() const;是不是是单播:bool isUnicast() const;1.5.2 其他函数boolisLinkLocal() const; bool isSiteLocal() const;bool isIPv4Compatible() const;bool isIPv4Mapped() const;bool isWellKnownMC() const;bool isNodeLocalMC() const; bool isLinkLocalMC() const; bool isSiteLocalMC() const
27、;bool isOrgLocalMC() const;bool isGlobalMC() const;1.5 protected 函数protected:void init(IPAddressImpl* pImpl);C+ POCO库中文编程参阅攻略(5) Poco:Net:SocketAddress1 枚举最大地址长度,这个与Poco:Net:IPAddress中的界说能够类 比,不过这里指的是struct sockaddr_in6enum MAX_ADDRESS_LENGTH = #if defined(POCO_HAVE_IPv6) sizeof(struct sockaddr_in6)
28、 #else sizeof(struct sockaddr_in) #endif / Maximum length in bytes of a socket address. ;2 布局函数创立一个 wildcard 的全 0 的 IPv4 的 socket 地址:SocketAddress();用 Poco:Net:IPAddress 和端口号创 建 IPv4 或 IPv6 的 SocketAddress:SocketAddress(const IPAddress& host, Poco:UInt16 port);用 std:string 和端口号 创立 IPv4 或 IPv6 的 Sock
29、etAddress:SocketAddress(const std:string& host, Poco:UInt16 port);SocketAddress(const std:string& host, const std:string& port);explicit SocketAddress(const std:string& hostAndPort);复制布局函数 :SocketAddress(const SocketAddress& addr);原生方法 布局 SocketAddress:SocketAddress(const struct sockaddr* addr, poco
30、_socklen_t length);3 常用函数swap:void swap (SocketAddress& addr);获取 IPAddress、端口和地址类型:IPAddress host() const;Poco:UInt16 port() const;IPAddress:Family family() const;获取原生方法的地址长 度、地址和地址族:poco_socklen_t length() const; const struct sockaddr* addr() const;int af() const;toString:std:string toString() const;4 重载运算符bool operator = (const SocketAddres
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1