1、 引言 Linux的兴起可以说是Internet创造的一个奇迹。Linux作为一个完全开放其原代码的免费的自由软件,兼容了各种UNIX标准(如POSIX、UNIX System V 和 BSD UNIX 等)的多用户、多任务的具有复杂内核的操作系统。在中国,随着Internet的普及,一批主要以高等院校的学生和ISP的技术人员组成的Linux爱好者队伍已经蓬勃成长起来。越来越多的编程爱好者也逐渐酷爱上这个优秀的自由软件。本文介绍了Linux下Socket的基本概念和函数调用。
5、 Linux中Socket的数据结构 (1) struct sockaddr { //用于存储套接字地址 unsigned short sa_family;//地址类型 char sa_data[14]; //14字节的协议地址 }; (2) struct sockaddr_in{ //in 代表internet short int sin_family; //internet协议族 unsigned short int sin_port;//端口号,必须是网络字节顺序 struct in_addr sin_addr;//internet地址,必须是网络字节顺序 unsigned char sin_zero;//添0(和struct sockaddr一样大小 }; (3) struct in_addr{ unsigned long s_addr; };
6、 网络字节顺序及其转换函数 (1) 网络字节顺序 每一台机器内部对变量的字节存储顺序不同,而网络传输的数据是一定要统一顺序的。所以对内部字节表示顺序与网络字节顺序不同的机器,一定要对数据进行转换,从程序的可移植性要求来讲,就算本机的内部字节表示顺序与网络字节顺序相同也应该在传输数据以前先调用数据转换函数,以便程序移植到其它机器上后能正确执行。真正转换还是不转换是由系统函数自己来决定的。 (2) 有关的转换函数 * unsigned short int htons(unsigned short int hostshort): 主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes * unsigned long int htonl(unsigned long int hostlong): 主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes * unsigned short int ntohs(unsigned short int netshort): 网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes * unsigned long int ntohl(unsigned long int netlong): 网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes 注:以上函数原型定义在netinet/in.h里
7、 IP地址转换 有三个函数将数字点形式表示的字符串IP地址与32位网络字节顺序的二进制形式的IP地址进行转换 (1) unsigned long int inet_addr(const char * cp):该函数把一个用数字和点表示的IP地址的字符串转换成一个无符号长整型,如:struct sockaddr_in ina ina.sin_addr.s_addr=inet_addr("202.206.17.101") 该函数成功时:返回转换结果;失败时返回常量INADDR_NONE,该常量=-1,二进制的无符号整数-1相当于255.255.255.255,这是一个广播地址,所以在程序中调用iner_addr()时,一定要人为地对调用失败进行处理。由于该函数不能处理广播地址,所以在程序中应该使用函数inet_aton()。 (2)int inet_aton(const char * cp,struct in_addr * inp):此函数将字符串形式的IP地址转换成二进制形式的IP地址;成功时返回1,否则返回0,转换后的IP地址存储在参数inp中。 (3) char * inet_ntoa(struct in-addr in):将32位二进制形式的IP地址转换为数字点形式的IP地址,结果在函数返回值中返回,返回的是一个指向字符串的指针。