• socket-(1)


    常见知识点:

    1、 网络常识 - IP地址、端口、网络协议、7层模型和4层/5层模型/osi

    2、 7层模型: 物理层、数据链路层、网络层、传输层、会话层、表现层、应用层

    3、 协议

    在网络中,有很多的规范(数据交互),这些规范叫做协议。

    常见协议:
    http - 超文本传输协议(互联网基础协议)
    ftp - 文件传输协议(文件上传和下载)
    邮件发送和接收协议 - smtp 和 pop3


    传输层协议:
    TCP协议 - 传输控制协议
    UDP协议 - 用户数据报协议
    网络层的IP协议 - 网络中查找计算机


    Tcp/ip 协议族
    TCP(Transmission Control Protocol)
    – 传输控制协议,基于连接的服务
     UDP(User Datagram Protocol)
    – 用户数据报协议,无连接的服务
     IP(Internet Protocol)
    – Internet协议,信息传递机制

    4、 协议簇

    一堆相关的协议组成一个协议簇(协议族),如:TCP/IP就是一个协议簇。

    5、 ip地址

    就是一个整数,最初时就是4字节整数,是计算机在网络中的唯一标识。两种表示方式:
    十六进制描述法(8位的十六进制) 针对计算机底层。
    点分十进制:每个字节算一个数(0-255),中间用点隔开。人接触的IP都是点分十进制。
    后来因为IP地址的分配不均,导致IP地址紧张,因此IP地址做了扩展,到了128位,因此IP地址有2种形式:IPV4 - 4字节 IPV6 ,主流的还是IPV4

    192.168.15.100 -> 点分十进制
    C0 A8 0F 64 -> 0xC0A80F64(十六进制)
    其实对应IP地址是一个。

    IP地址其实要和Mac地址绑定才能生效,Mac地址就是网卡的物理地址,就是网卡出厂时预先设定的编号,这个编号确保唯一。

    6、 查看ip地址的命令

    WINDOWS(DOS): ipconfig
    Unix : ifconfig (/sbin/ifconfig)

    7、 ip端口

    IP地址可以定位计算机,但数据传送时需要给计算机中的特定进程。端口 就是定位计算机中的进程。网络交互 必须有 IP地址和端口号。
    端口是一个short,值为 0-65535。不是所有端口都可以直接使用。
    0-1023 大部分都被系统占用,所以不要用。
    1024-48000多 程序员使用的,其中某些被程序占用。
    余下的是 动态端口,系统随时可能用一下,不稳定。

    8、 简单的socket编程的步骤

      8.1  服务端

      1) 创建socket关键字;

      2) 准备通信地址

      3) 绑定

      4) 通信

      5) 关闭

      8.2 客户端

      1) 创建socket关键字;

      2) 准备通信地址

      3) 连接

      4) 通信

      5) 关闭

      8.3 简单实例

      服务端:

      int main()

    {

      int sockfd = socket(AF_FILE,SOCK_DGRAM,0);//1、 创建soctet关键字

      if(sockfd == -1)

      {

        perror("socket"),exit(-1);

      }

      struct sockaddr_un addr;//2、 创建通信地址,用结构体

      addr.sun_family=AF_FILE;//与第一步中,创建sock关键字的一样

      strcpy(addr.sun_path,"./a.sock");//本地通信文件

      int res = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));//3绑定

      if(res == -1)

      {

        perror("bind"),exit(-1);

      }

      char buf[1024];

      memset(buf,0x00,sizeof(buf));

      int len = read(sockfd,buf,sizeof(buf));//4 通信

      printf("read %d ,The content is %s ",len,buf);

      close(sockfd);//5关闭

    }

    int main()

    {

      int sockfd = socket(AF_FILE,SOCK_DGRAM,0);

      if(sockfd == -1)

      {

        perror("socket"),exit(-1);

      }

      struct sockaddr_un addr;

      addr.sun_family = AF_FILE;

      strcpy(addr.sun_path,"./a.sock");

      int res=connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));

      if(res == -1)

      {

        perror("connect"),exit(-1);

      }

      write(sockfd,"aiyq195",5);

      close(sockfd);

    }

    上面的代码,还涉及到一些内容:

    socket有两种通信方式:本地通信和网络通信

    其中的关键函数

    1、 socket() 函数

    socket()函数,创建一个套接字 socket,返回 socket描述符。
    int socket(int domain,int type,int protocol)
    其中参数:
    domain 域,用于选择协议簇。
    AF_UNIX AF_LOCAL AF_FILE - 本地通信(IPC)
    AF_INET - 网络通信
    AF_INET6 - 网络通信IPV6

    type 用于选择通信类型
    SOCK_STREAM : 数据流,用于TCP
    SOCK_DGRAM : 数据报,用于UDP
    protocol 没有效果的参数,给0 即可。
    返回 socket描述符,用法和文件描述符差不多。失败返回-1。

    2、 通信地址

    通信地址有3个结构体,sockaddr不存储通信地址,只做参数的类型。通信地址存在另外两种结构中:
    本地通信的地址 sockaddr_un
    #include <sys/un.h>
    struct sockaddr_un{
    int sun_family;//协议簇,与socket一致
    char sun_path[];//socket文件的文件名
    };
    网络通信地址 sockaddr_in
    #include <netinet/in.h>
    struct sockaddr_in
    {
    int sin_family;//协议簇,与socket一致
    short sin_port;//端口号
    struct in_addr sin_addr;//IP地址
    };

    3、 bind()、connect() 函数

    bind(sockfd,sockaddr,addrlength)

    connect(sockfd,sockaddr,addrlenth)

  • 相关阅读:
    php数组·的方法1-数组的操作
    第十一章:DOM扩展
    第十章:DOM
    hxq的库
    第八章:BOM
    第七章:函数表达式2
    第七章:函数表达式
    第五章:引用类型(一)-Object和Array
    舌尖上的程序猿
    计算矩阵运算的乘法次数
  • 原文地址:https://www.cnblogs.com/aiyq195/p/6432479.html
Copyright © 2020-2023  润新知