1.socket基础知识:端口;sockaddr_in;字节序转换函数(本地/网络字节序);地址转换函数

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);   

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/83107727
今日推荐