sockaddr_in
window 头文件<winsock.h>
linux头文件 <netinet/in.h>或者<arpa/inet.h>
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
} ;
in_addr
window 头文件<winsock2.h>
linux 头文件<arpa/inet.h>
struct in_addr {
union {
struct {
u_char s_b1;
u_char s_b2;
u_char s_b3;
u_char s_b4;
} S_un_b;
struct {
u_short s_w1;
u_short s_w2;
} S_un_w;
u_long S_addr;
} S_un;
};
#define s_addr S_un.S_addr
#define s_host S_un.S_un_b.s_b2
#define s_net S_un.S_un_b.s_b1
#define s_imp S_un.S_un_w.s_w2
#define s_impno S_un.S_un_b.s_b4
#define s_lh S_un.S_un_b.s_b3
linux定义为
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
sockaddr
window 头文件<winsock.h>
linux 头文件<sys/socket.h>
struct sockaddr {
u_short sa_family;
char sa_data[14];
}
该地址在socket的主要接口中使用
int WSAAPI connect(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
int bind(
[in] SOCKET s,
const sockaddr *addr,
[in] int namelen
);
SOCKET WSAAPI accept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] int *addrlen
);
int WSAAPI getsockname(
[in] SOCKET s,
[out] sockaddr *name,
[in, out] int *namelen
);
int WSAAPI getpeername(
[in] SOCKET s,
[out] sockaddr *name,
[in, out] int *namelen
);
INADDR_ANY,linux需要头文件 <netinet/in.h>,windows下需要头文件<winsock2.h>
sockaddr_in6
window 头文件<ws2ipdef.h>
地址相关函数
需要头文件<arpa/inet.h>
- inet_addr
原型为
in_addr_t inet_addr(const char *strptr);
成功返回32位二进制的网络字节地址,有错,返回INADDR_NONE
- inet_ntoa,inet_aton
原型为
char* inet_ntoa(struct in_addr inaddr);
int inet_aton(const char* strptr, struct in_addr* addr);//成功返回 1,失败返回0
- inet_pton,inet_ntop
原型为
int inet_pton(int family, const char* strptr, void*addrptr);//成功返回1,不是有效的格式返回0,错误返回-1
const char* inet_ntop(int family, const void*addrptr, char*strptr, size_t len);//成功返回结果的指针,失败返回NULL
如果指定的family不是AF_INET,AF_INET6,函数返回错误,并且errno为EAFNOSUPPORT