1.端口
在进行通讯的时候,要首先通过IP地址获取主机
再通过Port用来区分和主机上的哪个应用程序通信
2.IPv4套接口地址结构:网际套接字地质结构 sockaddr_in:man 7 ip
1.头文件:netinet/in.h
2.sockaddr_in结构
struct sockaddr_in {
sa_family_t sin_family; /* 地址族: AF_INET */
u_int16_t sin_port; /* 按网络字节次序的端口 */
struct in_addr sin_addr; /* internet地址 */ 该结构体见下面:
};
/* Internet地址. */
struct in_addr {
u_int32_t s_addr; /* 按网络字节次序的地址 */
};
结论:
1.struct sockaddr_in和struct sockaddr是通用的
3.网络字节序:大端字节序
1.大小端介绍
0x12345678
大端字节序:低字节0x78放在高地址位
小端字节序:低字节0x78放在低地址位
判断方法1:
union S{
char a;
int b;
};
int main(){
union S s;
s.b=0x12345678;
if(s.a==0x78)
printf("small\n");
else
printf("big\n");
}
判断方法2:
int main(){
unsigned int data=0x12345678;
char* p=&data;
printf("%x,%x,%x,%x\n",p[0],p[1],p[2],p[3]);
if(p[0]==0x78)
printf("small...\n");
else
printf("big...\n");
}
2.字节序转换函数
主机字节序—>网络字节序
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
网络字节序—>主机字节序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
注解:h代表host;n代表networks;s代表short;l代表long
int main(){
unsigned int data=0x12345678;
char* p=&data;
printf("%x,%x,%x,%x\n",p[0],p[1],p[2],p[3]);
if(p[0]==0x78)
printf("small...\n");
else
printf("big...\n");
printf("-------------\n");
uint32_t myNetdata=htonl(data); //将data由主机字节序,使用htonl函数转换成网络字节序myNetdata
p=&myNetdata;
printf("%x,%x,%x,%x\n",p[0],p[1],p[2],p[3]);
if(p[0]==0x78)
printf("small...\n");
else
printf("big...\n");
}
3.主机A通过网络,向主机B发送数据:
主机A先将数据(从主机字节序 —> 网络字节序),再发送给网络
主机B,从网络中接收到数据,接收到数据后,再在将数据(从网络字节序 —> 主机字节序)
4.地址转换函数:点分十进制 <——> in_addr_t
int inet_aton(const char *cp, struct in_addr *inp); //1 char* --> in_addr
in_addr_t inet_addr(const char *cp); //2 char* ---> in_addr_t
in_addr_t inet_network(const char *cp);
char *inet_ntoa(struct in_addr in); //4 struct in_addr ---> char*
struct in_addr inet_makeaddr(int net, int host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
例1:点分十进制"192.168.88.9" ——> in_addr_t 或 struct in_addr
//1.char* --> in_addr
struct in_addr inp;
inet_aton("192.168.88.9",&inp);
printf("inp = %u\n",inp.s_addr);
//2.char* ---> in_addr_t
in_addr_t myint=inet_addr("192.168.88.9");
printf("myint = %u\n",myint);
例2:struct in_addr ——> 点分十进制"192.168.88.9"
struct in_addr addr; addr.s_addr=156805312;
char * p=inet_ntoa(addr);
printf("%s\n",p);