[gcc编程] socket编程——sockaddr_in结构体操作
(2009-08-25 22:42:17)| 标签: sockaddrsockaddr_inhbonboinet_addrinet_atoninet_ntoahtons | 分类: unix_gcc编程 | 
sockaddr的缺陷:sa_data把目标地址和端口信息混在一起了
| struct sockaddr { char sa_data[14]; }; | 
| sa_family是通信类型,最常用的值是 "AF_INET" sa_data14字节,包含套接字中的目标地址和端口信息 | 
sockaddr_in结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中
| struct sockaddr_in { short int sin_family; unsigned short int sin_port; 
 } | 
一般可视化的数字都是HBO(本机字节顺序)
| struct sockaddr_in cliaddr; bzero(&cliaddr,sizeof(cliaddr)); | 
| struct sockaddr_in ina; bzero(&ina,sizeof(ina)); ina.sin_family=AF_INET; ina.sin_port=htons(23); ina.sin_addr.s_addr = inet_addr("132.241.5.10"); | 
一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数
-  sockaddr_in用于socket定义和赋值 
-  sockaddr用于函数参数 
对于源、目的地址和源、目的地址端口,需要建立两个socket变量
cliaddr绑定源地址和源端口
servaddr用于connect和sendto的设定目的地址和目的端口
| struct sockaddr_in servaddr,cliaddr; create_socket(char *server_addr_string,unsigned int server_port) { 源socket赋值 目的socket赋值 } | 
结构体的sin_port和sin_addr都必须是NBO
一般可视化的数字都是HBO
inet_addr()
inet_aton()
inet_ntoa ()
htons()
htonl()
ntohs()
ntohl()
常用的是htons(),inet_addr()正好对应结构体的端口类型和地址类型
| inet_aton(server_addr_string,&myaddr.sin_addr); | 
| myaddr.sin_addr.s_addr = inet_addr("132.241.5.10"); | 
| INADDR_ANY转不转NBO随便 myaddr.sin_addr.s_addr = htons(INADDR_ANY); myaddr.sin_addr.s_addr = INADDR_ANY; | 
| #define MYPORT 3490 myaddr.sin_port = htons(MYPORT); | 
| 0(随机端口)转不转NBO随便 myaddr.sin_port = htons(0); myaddr.sin_port = 0; | 
唯一可以用于地址转换的htons是针对INADDR_ANY
-  inet_addr() 是返回值型 
| struct sockaddr_in ina; ina.sin_addr.s_addr = inet_addr("132.241.5.10"); | 
-  inet_aton() 是参数指针型 
| struct sockaddr_in ina; inet_aton("132.241.5.10",&ina.sin_addr); | 
参数:结构体变量.sinaddr
返回值:字符串指针
| a1 = inet_ntoa(ina.sin_addr); printf("address 1: %s\n",a1); | 
| address 1: 132.241.5.10 | 
因为inet_addr()的结果是整型,而发生错误时返回-1。
而 ina.sin_addr.s_addr是unsigned long型
-1在long short显示成111111111,和IP地址255.255.255.255相符合!会被误认为广播地址!

 加载中…
加载中…