socket编程用到两个地址结构:
struct sockaddr_in;
struct sockaddr;
其中,sockaddr_in用于基于tcp/ip协议的socket,定义在netinet/in.h
/*
* Socket address, internet style.
*/
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
* Socket address, internet style.
*/
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
其中,有用的的sin_port, sin_addr,sin_zero暂时没有用,添0。
sin_addr是struct in_addr结构,定义如下:
/*
* Internet address (a structure for historical reasons)
*/
struct in_addr {
u_long s_addr;
};
* Internet address (a structure for historical reasons)
*/
struct in_addr {
u_long s_addr;
};
存放十六进制的IP地址。
sockaddr是一个通用结构,内核使用这个结构,定义在sys/socket.h
/*
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
内核仅看sa_family参数,标识是那种传输层协议,sa_data交给对应的传输层协议模块处理。
socket地址相关的函数例如accept, bind, connect,sendto,recvfrom等都使用的是sockaddr结构,在使用以前需要转换。
评论
发表评论