C++ POCO库中文编程
操作方法
- 01
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 官网。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 - AIX Embedded: - Windows Embedded CE - Embedded Linux (uClibc or glibc) - iOS - QNX - VxWorks - Android 5 Namespaces Poco Poco::Crypto Poco::Data Poco::Data::MySQL Poco::Data::ODBC Poco::Data::SQLite Poco::Net Poco::Util Poco::Util::Units Poco::Util::Units::Constants Poco::Util::Units::Internal Poco::Util::Units::Values Poco::XML Poco::Zip C++ POCO库中文编程参阅攻略(2) 根本数据类型(Poco/Types.h)根本类型在Poco/Types.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 Handler typedef signed long IntPtr; 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 1 C++ POCO库中文编程参阅攻略(3) Poco::Net::Socket1 SelectMode enum SelectMode /// The mode argument to poll() and select(). { SELECT_READ = 1, SELECT_WRITE = 2, SELECT_ERROR = 4 };2 SocketList typedef std::vectorSocketList; 3 布局函数 未初始化的 socket: Socket (); 复制布局函数 Socket(const Socket& socket); 4 重载运算符 赋值运算符: Socket& operator = (const 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; bool operator >= (const Socket& socket) const;5 常用 socket 操作 回来该 socket 的可读数据的字节数,该操作不导致 socket 堵塞: int available() const; 封闭 socket: void close(); poll: bool poll(const Poco::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 operation 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(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 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) 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 seconds); 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(bool 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, 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 contains 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. /// /// If the total number of sockets passed in readList, writeList and /// 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 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 的长度 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(); 复制布局函数: 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 是十六进制表 示的: IPAddress(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, Poco::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 IPAddress& addr) const; bool operator >= (const IPAddress& 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 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 是不是是未初始 化状况 是不是是未初始化的全零状况(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:x:x:x:x:x:x的规模: 函数原型: bool isMulticast() const; 是不是是单播: bool isUnicast() const; 1.5.2 其他函数 bool isLinkLocal() const; bool isSiteLocal() const;bool isIPv4Compatible() const;bool isIPv4Mapped() const;bool isWellKnownMC() const;bool isNodeLocalMC() const; bool isLinkLocalMC() const; bool isSiteLocalMC() const;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_in6 enum { MAX_ADDRESS_LENGTH = #if defined(POCO_HAVE_IPv6) sizeof(struct sockaddr_in6) #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 的 SocketAddress: 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_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 SocketAddress& addr) const; bool operator != (const SocketAddress& addr) const; 5 protected 函数 void init(const IPAddress& host, Poco::UInt16 port); void init(const std::string& host, Poco::UInt16 port); Poco::UInt16 resolveService(const std::string& service);