zoukankan      html  css  js  c++  java
  • sockaddr & sockaddr_in struct

    struct sockaddr {
    unsigned  short  sa_family;     /* address family, AF_xxx */
    char  sa_data[14];                 /* 14 bytes of protocol address */
    };

    sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。

    sa_data是14字节协议地址。
    此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

    但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
    sockaddr_in(在netinet/in.h中定义):

    struct  sockaddr_in {
    short  int  sin_family;                      /* Address family */
    unsigned  short  int  sin_port;       /* Port number */
    struct  in_addr  sin_addr;              /* Internet address */
    unsigned  char  sin_zero[8];         /* Same size as struct sockaddr */
    };
    struct  in_addr {
    unsigned  long  s_addr;
    };

     sin_family指代协议族,在socket编程中只能是AF_INET

    sin_port存储端口号(使用网络字节顺序)
    sin_addr存储IP地址,使用in_addr这个数据结构
    sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
    s_addr按照网络字节顺序存储IP地址

    sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
    sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
    在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
    mysock结构体名
    mysock.sa_family=AF_INET;
    mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
    ……
    等到要做转换的时候用:
    (struct sockaddr*)mysock

    使用的例子

     1 #define SERVER_PORT 8080
     2 int sockfd,err,newfd;
     3     struct sockaddr_in addr;
     4     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     5     if(sockfd < 0){
     6         perror("socket creation failed!
    ");
     7         return;
     8     }
     9     memset(&addr, 0, sizeof(addr));
    10     addr.sin_family = AF_INET;
    11     addr.sin_port = htons(SERVER_PORT);
    12     addr.sin_addr.s_addr = INADDR_ANY;
    13     if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
    14         perror("socket binding failed!
    ");
    15         return;
    16     }
  • 相关阅读:
    leetcode--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/diegodu/p/3927144.html
Copyright © 2011-2022 走看看