📄 ipsock.h
字号:
* Fixed up comments.
*
* Revision 1.16 1995/12/23 03:44:59 robertj
* Fixed unix portability issues.
*
* Revision 1.15 1995/12/10 11:32:11 robertj
* Numerous fixes for sockets.
*
* Revision 1.14 1995/10/14 14:57:26 robertj
* Added internet address to string conversion functionality.
*
* Revision 1.13 1995/07/02 01:18:19 robertj
* Added static functions to get the current host name/address.
*
* Revision 1.12 1995/06/17 00:41:40 robertj
* More logical design of port numbers and service names.
*
* Revision 1.11 1995/03/18 06:26:44 robertj
* Changed IP address variable for GNU compatibility.
*
* Revision 1.10 1995/03/14 12:41:38 robertj
* Updated documentation to use HTML codes.
*
* Revision 1.9 1995/03/12 04:38:41 robertj
* Added more functionality.
*
* Revision 1.8 1995/01/02 12:28:24 robertj
* Documentation.
* Added more socket functions.
*
* Revision 1.7 1995/01/01 01:07:33 robertj
* More implementation.
*
* Revision 1.6 1994/12/15 12:47:14 robertj
* Documentation.
*
* Revision 1.5 1994/08/23 11:32:52 robertj
* Oops
*
* Revision 1.4 1994/08/22 00:46:48 robertj
* Added pragma fro GNU C++ compiler.
*
* Revision 1.3 1994/08/21 23:43:02 robertj
* Spelt Berkeley correctly.
*
* Revision 1.2 1994/07/25 03:36:03 robertj
* Added sockets to common, normalising to same comment standard.
*
*/
#ifndef _PIPSOCKET
#define _PIPSOCKET
#ifdef P_USE_PRAGMA
#pragma interface
#endif
#include <ptlib/socket.h>
#ifdef P_HAS_QOS
#ifdef _WIN32
#ifdef P_KNOCKOUT_WINSOCK2
#include "IPExport.h"
#endif // KNOCKOUT_WINSOCK2
#endif // _WIN32
#endif // P_HAS_QOS
/** This class describes a type of socket that will communicate using the
Internet Protocol.
If P_HAS_IPV6 is not set, IPv4 only is supported.
If P_HAS_IPV6 is set, both IPv4 and IPv6 adresses are supported, with
IPv4 as default. This allows to transparently use IPv4, IPv6 or Dual
stack operating systems.
*/
class PIPSocket : public PSocket
{
PCLASSINFO(PIPSocket, PSocket);
protected:
/* Create a new Internet Protocol socket based on the port number
specified.
*/
PIPSocket();
public:
/**
A class describing an IP address
*/
class Address : public PObject {
public:
/**@name Address constructors */
//@{
/// Create an IPv4 address with the default address: 127.0.0.1 (loopback)
Address();
/** Create an IP address from string notation.
eg dot notation x.x.x.x. for IPv4, or colon notation x:x:x::xxx for IPv6
*/
Address(const PString & dotNotation);
/// Create an IPv4 or IPv6 address from 4 or 16 byte values
Address(PINDEX len, const BYTE * bytes);
/// Create an IP address from four byte values
Address(BYTE b1, BYTE b2, BYTE b3, BYTE b4);
/// Create an IPv4 address from a four byte value in network byte order
Address(DWORD dw);
/// Create an IPv4 address from an in_addr structure
Address(const in_addr & addr);
#if P_HAS_IPV6
/// Create an IPv6 address from an in_addr structure
Address(const in6_addr & addr);
/// Create an IP (v4 or v6) address from a sockaddr (sockaddr_in,
/// sockaddr_in6 or sockaddr_in6_old) structure
Address(const int ai_family, const int ai_addrlen,struct sockaddr *ai_addr);
#endif
#ifdef __NUCLEUS_NET__
Address(const struct id_struct & addr);
Address & operator=(const struct id_struct & addr);
#endif
/// Copy an address from another IP v4 address
Address & operator=(const in_addr & addr);
#if P_HAS_IPV6
/// Copy an address from another IPv6 address
Address & operator=(const in6_addr & addr);
#endif
/// Copy an address from a string
Address & operator=(const PString & dotNotation);
/// Copy an address from a four byte value in network order
Address & operator=(DWORD dw);
//@}
/// Compare two adresses for absolute (in)equality
Comparison Compare(const PObject & obj) const;
bool operator==(const Address & addr) const { return Compare(addr) == EqualTo; }
bool operator!=(const Address & addr) const { return Compare(addr) != EqualTo; }
#if P_HAS_IPV6
bool operator==(in6_addr & addr) const;
bool operator!=(in6_addr & addr) const { return !operator==(addr); }
#endif
bool operator==(in_addr & addr) const;
bool operator!=(in_addr & addr) const { return !operator==(addr); }
bool operator==(DWORD dw) const;
bool operator!=(DWORD dw) const { return !operator==(dw); }
#ifdef P_VXWORKS
bool operator==(long unsigned int u) const { return operator==((DWORD)u); }
bool operator!=(long unsigned int u) const { return !operator==((DWORD)u); }
#endif
#ifdef _WIN32
bool operator==(unsigned u) const { return operator==((DWORD)u); }
bool operator!=(unsigned u) const { return !operator==((DWORD)u); }
#endif
#ifdef P_RTEMS
bool operator==(u_long u) const { return operator==((DWORD)u); }
bool operator!=(u_long u) const { return !operator==((DWORD)u); }
#endif
#ifdef __BEOS__
bool operator==(in_addr_t a) const { return operator==((DWORD)a); }
bool operator!=(in_addr_t a) const { return !operator==((DWORD)a); }
#endif
bool operator==(int i) const { return operator==((DWORD)i); }
bool operator!=(int i) const { return !operator==((DWORD)i); }
/// Compare two addresses for equivalence. This will return TRUE
/// if the two addresses are equivalent even if they are IPV6 and IPV4
#if P_HAS_IPV6
bool operator*=(const Address & addr) const;
#else
bool operator*=(const Address & addr) const { return operator==(addr); }
#endif
/// Format an address as a string
PString AsString() const;
/// Convert string to IP address. Returns TRUE if was a valid address.
BOOL FromString(
const PString & str
);
/// Format an address as a string
operator PString() const;
/// Return IPv4 address in network order
operator in_addr() const;
#if P_HAS_IPV6
/// Return IPv4 address in network order
operator in6_addr() const;
#endif
/// Return IPv4 address in network order
operator DWORD() const;
/// Return first byte of IPv4 address
BYTE Byte1() const;
/// Return second byte of IPv4 address
BYTE Byte2() const;
/// Return third byte of IPv4 address
BYTE Byte3() const;
/// Return fourth byte of IPv4 address
BYTE Byte4() const;
/// return specified byte of IPv4 or IPv6 address
BYTE operator[](PINDEX idx) const;
/// Get the address length (will be either 4 or 16)
PINDEX GetSize() const;
/// Get the pointer to IP address data
const char * GetPointer() const { return (const char *)&v; }
/// Get the version of the IP address being used
unsigned GetVersion() const { return version; }
/// Check address 0.0.0.0 or ::
BOOL IsValid() const;
BOOL IsAny() const;
/// Check address 127.0.0.1 or ::1
BOOL IsLoopback() const;
/// Check for Broadcast address 255.255.255.255
BOOL IsBroadcast() const;
// Check if the remote address is a private address.
// For IPV4 this is specified RFC 1918 as the following ranges:
// 10.0.0.0 - 10.255.255.255.255
// 172.16.0.0 - 172.31.255.255
// 192.168.0.0 - 192.168.255.255
// For IPV6 this is specified as any address having "1111 1110 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -