【版权申明】转载请附上出处链接
socket编程中常见的数据结构
struct addrinfo
#include <netdb.h>
socket 网络信息相关结构体:
/* Structure to contain information about address of a service provider. */
struct addrinfo
{
int ai_flags; /* Input flags. */
int ai_family; /* Protocol family for socket. */
int ai_socktype; /* Socket type. */
int ai_protocol; /* Protocol for socket. */
socklen_t ai_addrlen; /* Length of socket address. */
struct sockaddr *ai_addr; /* Socket address for socket. */
char *ai_canonname; /* Canonical name for service location. */
struct addrinfo *ai_next; /* Pointer to next in list. */
};
- ai_flags,指定处理地址和主机名的方式
- ai_family,地址族。指定调用者期待返回的套接口地址结构的类型
- ai_socktype,socket的类型。
- ai_protocol,socket协议。
IPPROTO_IP | 0 | IP协议 |
IPPROTO_IPV4 | 4 | IPv4 |
IPPROTO_IPV6 | 41 | IPv6 |
IPPROTO_TCP | 6 | TCP |
IPPROTO_UDP | 17 | UDP |
struct sockaddr
bits/socket.h
通用的socket地址描述结构体:
/* Structure describing a generic socket address. */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
其中的__SOCKADDR_COMMON (sa_);又可转变成:
#include<bits/sockaddr.h>
/* This macro is used to declare the initial common members
of the data types used for socket addresses, `struct sockaddr',
`struct sockaddr_in', `struct sockaddr_un', etc. */
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
即:
sa_family_t sa_family;
struct sockaddr_in
#include<netinet/in.h>
与struct sockaddr结构体类似
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
struct sockaddr_un
#include<sys/un.h>
与struct sockaddr结构体类似
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket. */
struct sockaddr_un
{
__SOCKADDR_COMMON (sun_);
char sun_path[108]; /* Path name. */
};
socklen_t
/* Duplicate info from sys/socket.h. bits/types.h */
__STD_TYPE __U32_TYPE __socklen_t;
/* Type for length arguments in socket calls. bits/socket.h */
#ifndef __socklen_t_defined
typedef __socklen_t socklen_t;
#define __socklen_t_defined
#endif
struct sockaddr_storage
bits/socket.h
struct sockaddr_storage
{
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
char __ss_padding[_SS_PADSIZE];
__ss_aligntype __ss_align; /* Force desired alignment. */
};