关于网络编程,第一个头痛的就是关于其各种不同的地址格式:
UNIX
struct in_addr{
in_addr_t s_addr;}; /*32为的地址结构,是网络字节序*/
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family; /*AF_INET (套接字地址结构的地址族)*/
in_port_t sin_port; /*16bit的TCP或udp的端口号,是网络字节序*/
struct in_addr sin_addr; //32字节的ipv4地址,是网络字节序
char sin_zero[8]; //保留
};
Window
typedef 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_un; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;union的作用是将大括号里所有的东西的内存分配都放在一起。使用的时候只有一个能使用。可以使S_un.S_addr S_un.S_ub_b S_un.Sun_w
我们可以用两种方式来引用一个ipv4的套接字地址结构,也叫网际套接字地址结构
假设 struct sockaddr_in serv;
则 serv.sin_addr 和serv.sin_addr.sin_addr都可以引用到ip地址。只不过一个是引用in_addr是一个结构体,另一个in_addr_t是一个无符号的整数,这点要注意区分.
在实际使用的时候常常有两种模式 connect(sd, (const struct sockaddr*)&addr, sizeof(addr)); 和connect(sd, (LPSOCKADDR)&addr, sizeof(addr));
就目前的理解,他俩没有什么区别 就是说 const struct sockaddr* 和LPSOCKADDR 个人理解LP也可以理解成long pointer
下面说一下对主机字节序和网络字节序的理解,其实我们不需要知道他们怎么表示inet_addr(const char* strptr) 如servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
这个函数是将一个形如"127.0.0.1"字符串转化成一个网络字节序;
相反,也有着char FAR* inet_ntoa(struct in_addr in);可以将一个网络字节序转化成我们常见的字符串表示
也有着网络字节序和主机字节序转换的函数如 : htonl() htons() ntohl() ntohs()这几个其实很好记 h代表着host 主机 n代表net网络 l代表long 四个字节 s是short 两个字节 常用于端口的转换。