结构体
- struct sockaddr_in
- struct sockaddr
- struct in_addr
这三个结构体在网络编程中经常忘记各自的成员,需要临时查阅。
struct sockaddr
{
/***** 地址族 AF_xxx *****/
unsigned short sa_family;
/***** 14字节的协议地址 *****/
char sa_data[14];
};
以上是通用的socket地址,具体到internet socket 用下面的结构体,二者可以进行类型转换
struct sockaddr_in
{
/***** 地址族 *****/
short int sin_family;
/***** 端口号 *****/
unsigned short int sin_port;
/***** Internet 地址 *****/
struct in_addr sin_addr;
/***** 与 struct sockaddr 一样长度的填充 *****/
unsigned char sin_zero[8];
};
/***** 32位IP地址 *****/
sturct in_addr
{
unsinged long s_addr;
};
/***** 也有可能定义为以下 *****/
struct in_addr {
union
{
struct
{
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct
{
u_short s_w1,s_w2;
}S_un_w;
u_long S_addr;//成员s_addr为长整形结构
} S_un;
};
u_long htonl(u_long hostlong) : 将主机字节序转换为TCP/IP网络字节序
u_short htons(u_short hostshort):将主机字节序转换为tcp/ip网络字节序
inet_addr 是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)
/***
**一般用法如下:
***/
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET,SOCK_STREAM,0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MY_PORT);
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
bzero(&my_addr.sin_zero,8);
- inet_addr:将网络地址转为网络二进制数字,返回的IP地址是网络序的。原型为:
unsigned long int inet_addr(const char* ip);
- inet_aton:将网络地址转为网络二进制数字,与inet_addr的却别是,保存形参inp所指向的in_addr结构体中:
int inet_aton(const char* ip,struct in_addr* sin_addr);
- inet_ntoa:将网络二进制数字转为网络地址:
char* inet_ntoa(struct in_addr* sin_addr);
升级版的转换函数:
字符串到网络地址
- inet_pton
- inet_ntop
后面补充。。。。