Socket编程::主要数据结构及转换函数

759阅读 0评论2012-06-20 xbjpkpk
分类:

1、struct sockaddr
    存储套接字地址

点击(此处)折叠或打开

  1. struct sockaddr
  2. {
  3.     unsigned short sa_family; /*address族*/
  4.     char sa_data[14];         /*14bytes的协议地址*/
  5. }
    其中sa_family一般为AF_INET,sa_data包括了主机的地址、端口等信息。

2、struct sockaddr_in
    sockaddr_in是sockaddr的替代品,sin_family相当于sockaddr中的sa_family,sin_addr和sin_port必须是网络字节顺序的。

点击(此处)折叠或打开

  1. struct sockaddr_in
  2. {
  3.     short int sin_family;        /*Internet地址族*/
  4.     unsigned short int sin_port; /*端口号*/
  5.     struct in_addr sin_addr;     /*Internet地址*/
  6.     unsigned char sin_zero[8];   /*添0操作,目的是和struct sockaddr一样大小,可以通过bzero或memset实现*/
  7. }

3、struct in_addr

点击(此处)折叠或打开

  1. struct in_addr
  2. {
  3.     unsigned long s_addr;
  4. }

4、网络字节序 vs 主机字节序
    主机字节序是指机器内部对变量的字节存储顺序,有的机器是高位在前,有的则是低位在前。而网络传输要求大家的数据顺序是统一的。因此就需要进行字节序的转换。除此之外,转换的另一个好处是易于移植程序。
    相关转换函数: ('h':Host、'n':Network、's':Short、'l':Long)
    htons: 主机字节序转换为网络字节序(对无符号短整型,4bytes)
    htonl:  主机字节序转换为网络字节序(对无符号长整型,8bytes)

    ntohs: 网络字节序转换为主机字节序(对无符号短整型,4bytes)
    ntohl:  网络字节序转换为主机字节序(对无符号长整型,8bytes)

5、IP地址转换函数
    inet_addr:
        能将用数字和点表示的IP地址转换成一个无符号长整型,如

点击(此处)折叠或打开

  1. struct sockaddr_in pSock;
  2. pSock.sin_addr.s_addr = inet_addr("192.168.18.100");
        inet_addr返回的已经是网络字节序了,没必要再进行转换。

    inet_ntoa:
        打印IP地址(以数字加点的形式),如

点击(此处)折叠或打开

  1. struct sockaddr_in pSock;
  2. char *p;
  3. p = inet_ntoa(pSock.sin_addr);
  4. printf("%s\n",p);


   
上一篇:[嵌入式中国 http://www.armchina.cn/ 转帖]既是老师又是师兄的临别箴言
下一篇:linux下socket编程常用头文件