zoukankan      html  css  js  c++  java
  • 套接字的域和地址族

      今天,说一下套接字的域和地址族。前面linux的套接口和管道已经说到domain这个参数了,这个参数可以使AF_LOCAL.AF_LOCAL的前缀AF_表示地址族(address family),domain参数就是在选择到底使用哪个地址族。

      通用套接字地址的结构:

    struct sockaddr {
        sa_family_t sa_family;//地址族
        char            sa_data[14];//地址数据
    };

    其中sa_family_t是一个无符号的短整数。整个数据占16个字节。

      我们常见的domain参数一般是AF_INET(IPv4),AF_INET6(IPv6)。AF_INET的结构格式为:

    #include <netinet/in.h>
    struct sockaddr_in {
        sa_family_t    sin_family;//地址族
        uint16_t         sin_port;//端口号
        struct in_addr sin_addr;//Inernet地址
        unsigned char sin_zero[8];//占位字节
    };

      说到网络字节问题,就需要考虑到网络字节序。因为字节序有些系统是不同的。为了实现大端/小端字节序之间的转换,系统提供了几个转换函数:

    #include <netinet/in.h>
    unsigned long htonl(unsigned long hostlong);
    unsigned short htons(unsigned short hostshort);
    unsigned long ntohl(unsigend long netlong);
    unsigned short ntohs(unsigned short netshort);

      有了前面的介绍,可以开始初始化Internet地址了。下面的例子使用了到了socket()bind()函数。

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    //error,用于输出错误
    static void bail(const char *on_what)
    {
        perror(on_what);
        exit(1);
    }
    
    int main()
    {
        int sck_inet = socket(AF_INET,SOCK_STREAM,0);//套接口,套接字
        if (sck_inet == -1)
        {
            bail("sock()");
        }
        struct sockaddr_in adr_inet;//IPv4地址结构
        memset(&adr_inet,0,sizeof adr_inet);
        adr_inet.sin_family = AF_INET;
        adr_inet.sin_port = htons(8081);
        const unsigned char IPno[] = {127,0,0,23};
        memcpy(&adr_inet.sin_addr.s_addr,IPno,4);
        int len_inet = sizeof adr_inet;
        int z = bind(sck_inet, (struct sockaddr*)&adr_inet,len_inet);//绑定套接字和ip地址
        if (z == -1)
        {
            bail("bind()");
        }
        system("netstat -pa --tcp 2>/dev/null | " "sed -n '1,/^Proto/p;/af_inet/p' ");
        close(sck_inet);
        return 0;
    }

      今天的套接字就介绍到这,下一篇要介绍的是地址转换函数

     

  • 相关阅读:
    Centos7下thinkphp5.0环境配置
    win10蓝牙鼠标无法连接,需pin码
    thinkphp5自带workerman应用
    php文件加密(screw方式)
    centos修改ssh默认端口号的方法
    修改CentOS ll命令显示时间格式
    在线编辑器的原理简单示例
    [转载]提升SQLite数据插入效率低、速度慢的方法
    linux 客户机挂载vitualbox共享文件夹
    virtualbox linux客户机中安装增强功能包缺少kernel头文件问题解决
  • 原文地址:https://www.cnblogs.com/hanxi/p/2540125.html
Copyright © 2011-2022 走看看