123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /************************************************************************/
- /* Copyright (C), 2016-2020, [IT], 保留所有权利;
- /* 模 块 名:SockAddrIn;
- /* 描 述:SockAddrIn结构体,内部封装了 SOCKADDR_STORAGE (IPv4: SOCKADDR_IN, IPv6: SOCKADDR_IN6) 结构体;
- /*
- /*
- /* 版 本:[V];
- /* 作 者:[IT];
- /* 日 期:[2/23/2016];
- /*
- /*
- /* 注 意:;
- /*
- /* 修改记录:[IT];
- /* 修改日期:;
- /* 修改版本:;
- /* 修改内容:;
- /************************************************************************/
- #ifndef __SOCKADDRIN_20160303__
- #define __SOCKADDRIN_20160303__
- #pragma once
- #ifdef WIN32
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #elif BSD_SOCKET
- #include "platform.h"
- #endif
- struct SockAddrIn : public sockaddr_storage
- {
- public:
- SockAddrIn();
- ~SockAddrIn();
- // 拷贝构造;
- SockAddrIn(IN const SockAddrIn& sin);
- // 复制函数;
- SockAddrIn& Copy(IN const SockAddrIn& sin);
- // 清空结构体;
- void Clear();
- // 对比地址是否相同;
- bool IsEqual(IN const SockAddrIn& sin) const;
- // 如果NULLAddr无效,返回TRUE;
- bool IsNull() const { return IsEqual(NULLAddr); }
- // 返回地址簇类型;
- short GetFamily() const { return ss_family; }
- // 返回IPV4网络地址;
- ULONG GetIPAddr() const { return ((SOCKADDR_IN*)this)->sin_addr.s_addr; }
- // 获取网络端口;
- short GetPort() const { return ((SOCKADDR_IN*)this)->sin_port; }
- // 创建服务端地址(同时支持IPV4和IPV6);
- bool CreateFrom(IN LPCTSTR pszAddr, IN LPCTSTR pszService, IN int nFamily /*= AF_INET*/, bool bIsClient = true);
- // 创建服务端地址(只支持IPV4);
- bool CreateFrom(IN ULONG lIPAddr, IN USHORT nPort, IN int nFamily = AF_INET, IN bool bFmtHost = true);
- // 赋值拷贝函数,返回this指针引用;
- SockAddrIn& operator=(const SockAddrIn& sin) { return Copy( sin ); }
- // 相等操作判断,相等返回TRUE;
- bool operator==(const SockAddrIn& sin) const { return IsEqual( sin ); }
- // 不等操作判断,如果不同返回TRUE;
- bool operator!=(const SockAddrIn& sin) const { return !IsEqual( sin ); }
- // 转换SOCKADDR地址,返回SOCKADDR格式的this对象;
- operator LPSOCKADDR() { return reinterpret_cast<LPSOCKADDR>(this); }
- // 转换PIN6_ADDR地址,返回PIN6_ADDR格式的this对象;
- operator const IN6_ADDR*() const { return reinterpret_cast<const IN6_ADDR*>(this); }
- // 转换PIN6_ADDR地址,返回PIN6_ADDR格式的this对象;
- operator PIN6_ADDR() { return reinterpret_cast<PIN6_ADDR>(this); }
- // 返回结构体(SOCKADDR_IN) 或 (SOCKADDR_STORAGE)的大小(由地址协议簇决定);
- size_t Size() const { return (ss_family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_storage); }
- // 以SOCKADDR_IN结构体来初始化this对象;
- void SetAddr(IN const sockaddr_in* psin) { SetAddr(reinterpret_cast<const sockaddr_storage*>(psin)); }
- // 以SOCKADDR_IN6结构体来初始化this对象;
- void SetAddr(IN const sockaddr_in6* psin) { SetAddr(reinterpret_cast<const sockaddr_storage*>(psin)); }
- // 以SOCKADDR_STROAGE结构体来初始化this对象;
- void SetAddr(IN const sockaddr_storage* pss) { ss_family = pss->ss_family; memcpy(this, pss, Size()); }
- // 空的地址值,用于比较另一地址是否空;
- static SockAddrIn NULLAddr;
- };
- #endif
- /* // IPV4地址结构;
- /* struct SOCKADDR_IN{
- /* SHORT sin_family; // 地址簇;
- /* USHORT sin_port; // 端口号;
- /* in_addr sin_addr; // 地址;
- /* CHAR sin_zero[8]; // IPV4为了填充结构体来保持固定大小,无意义;
- /* };
- /*
- /* struct IN_ADDR{
- /* unsigned long s_addr; // 地址;
- /* };
- /*
- /* // IPV6地址结构;
- /* struct SOCKADDR_IN6{
- /* USHORT sin6_family; // 地址簇类型:AF_INET6;
- /* USHORT sin6_port; // 16位端口号;
- /* ULONG sin6_flowinfo; // 32位流标签;
- /* in6_addr sin6_addr; // 128位IP地址;
- /* union
- /* {
- /* ULONG sin6_scope_id; // Set of interfaces for a scope.
- /* SCOPE_ID sin6_scope_struct;
- /* };
- /* };
- /*
- /* struct in6_addr {
- /* union {
- /* UCHAR Byte[16];
- /* USHORT Word[8];
- /* } u;
- /* } ;
- /*
- /* typedef struct {
- /* union {
- /* struct
- /* {
- /* ULONG Zone : 28;
- /* ULONG Level : 4;
- /* };
- /* ULONG Value;
- /* };
- /* } SCOPE_ID, *PSCOPE_ID;
- */
|