Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18387
  • 博文数量: 12
  • 博客积分: 266
  • 博客等级: 二等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-07 10:14
文章分类

全部博文(12)

文章存档

2012年(4)

2011年(8)

我的朋友

分类: 系统运维

2011-04-07 11:11:36

    struct sockaddr     //通用套接字地址结构,定义在头文件中;
    {
        uint8_t            sa_len;
        sa_family_t        sa_family;        //协议组,比如AF_XXX等;
        char               sa_data[14];      //协议地址,14个字节;
    };
    sa_family一般为AF_INET,AF表示ADDRESS FAMILY,是地址族的意思。一般情况下#define AF_INET 0,sa_data则包含该socket的IP地址和端口号。不过这个套接字地址结构用的比较少,通常情况下,都是用下面一个。
    struct sockaddr_in                       //sockaddr_in定义在头文件中;
    {
        uint8_t              sin_len;
        sa_family_t          sin_family;     //协议类型,同struct sockaddr中的sa_family;
        in_port_t            sin_port;       //端口号;
        struct in_addr       sin_addr;       //地址
        char                 sin_zero[8];    //这个是为了达到使套接字地址结构达到16个字节;
    }  ;
    sockaddr_in和sockaddr是并列的结构,可以相互转化。一般使用sockaddr_in建立套接字,然后使用struct sockaddr*可以进行强制转化,比如定义一个struct sockaddr_in a;那么(struct sockaddr*)a就把这个套接字的类型进行了强制转化。
    另外,struct in_addr的定义是:
    struct in_addr
    {
        in_addr_t     s_addr; //表示32位的网络地址,如0xC0A80001(点分制表示就是192.168.0.1)。
    };
    下面举例定义一个套接字地址结构:
    #define LOCAL_PORT     6666
    #define LOCAL_IP       192.168.0.1
    struct sockaddr_in  my_example;
    bzero(&my_example,sizeof(my_example));               //初始化
    my_example.sin_family=AF_INET;                       //协议组,使用的是IPv4
    my_example.sin_port=htons(LOCAL_PORT);               //转换成网络字节序的端口
    my_example.sin_addr.s_addr=inet_addr("LOCAL_IP");    //把字符串形式的ip转换成网络字节序
    ...
阅读(1301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~