• unix c 10


    网络常识:
       OSI 7层模型  TCP模型
       IP和端口
       IP是用来定位网络中的计算机,端口用来代表 计算机中的某个进程。
       IP 有点分十进制 和 十六进制的两种表示方式,底层 十六进制的 整数,点分十进制是给 人类使用。


    IP地址分为A、B、C、D 4类。
       查看IP地址的命令:
       Windows Dos -> ipconfig
       Unix/Linux -> ifconfig
       查看网络是否通畅:ping IP地址

       子网掩码用于 判断是否同一网段。
       166.111.160.1
       255.255.254.0
       -----------------
       166.111.160.0

       166.111.161.45
       255.255.254.0
       —————————
       166.111.160.0

       子网掩码:255.255.254.0

       端口 的整数 0-65535,但不是都能使用。
       0-1023 都被系统占用(不是全部)
        80 http
        21 ftp
        23 telnet
       1024-48XXX 可以使用,其中有一些会被某些软件占有

       48XXX以后不要使用,系统会随时调用,不稳定端口

      网络编程需要使用IP+端口。
         socket网络编程
         socket 叫套接字
         由于网络出现时间非常长,因此socket编程比较成熟。
         socket编程 支持 TCP和UDP传输。
         可以做一对一通信,也可以做一对多通信。
         一对多 必然会启动多进程或多线程(更常用)。

      socket编程 也支持 本地的进程间通信(不常用)。
      1 写一个socket的本地通信(IPC)
       1.1 服务端
         1) 创建一个socket,调函数socket()
              int socket(int domain,int type,int protocol)
             返回一个 socket的描述符,和文件描述符一样。
             失败返回 -1.
            domain: 域,用来选择协议簇/协议族(不专业)
            用来指明 是本地通信还是网络通信
            PF_UNIX    PF_LOCAL  PF_FILE 都是本地通信
            PF_INET  网络通信
            PF_INET6 IPV6的网络通信(较少使用)
        所有 的PF 换成 AF 效果一样,都是一个数。
           type: 用来选择通信类型(TCP还是UDP)
           SOCK_STREAM - 数据流,就是用TCP
           SOCK_DGRAM - 数据报,就是用UDP
           protocol参数已经失去作用,给0即可。

         2) 准备通信地址
             通信地址 包括3个结构体(历史)。
             sockaddr    负责做参数,不需要直接使用。
             sockaddr_un 存储本地通信的地址信息,需要
             sys/un.h头文件。
             sockaddr_in 存储网络通信的地址信息,需要netinet/in.h头文件。
             struct sockaddr_un{
                int sun_family; //协议簇,与socket呼应
                char sun_path[];//做媒介的socket文件
             };
             struct sockaddr_in{
                int sin_family;//协议簇
                short sin_port;//端口
                struct in_addr sin_addr;//IP地址结构体
            };
         3) 绑定通信地址和socket描述符
              bind(int sockfd,addr,addrlen);
         4) 通信(read/write),和文件一样
         5) close
       1.2 客户端
         与服务端一样,只有第三步bind函数换成connect()即可。
         注: 服务端和客户端的读写要保持交互次序。
       1 写一个socket的网络通信(一对一)
        代码步骤与上面基本一致,通信地址换成sockaddr_in即可。其中,ip和端口都需要转换。
        ip需要把点分十进制转成十六进制格式,函数:
           inet_addr()
       端口需要把本机格式转成网络格式,函数:
           htons()

      TCP之  一对多开发:
      服务端:
        1 创建socket,调 socket函数,用来做 等待客户端的连接,不用于 信息交互。
        2 准备通信地址,一样(sockaddr_in)
        3 绑定 bind
        4 监听 listen(sockfd,int 最大并行连接数)
        5 等待客户端的连接,连接成功后 返回一个新的socket描述符 用于信息交互。函数:accept()
        6 读写数据
        7 关闭连接。
        客户端没有变化。

      关于accept()
         第一个参数是第一步的sockfd,
         第二个参数是用于存放连接客户端通信地址的结构体指针
         第三个参数必须传入通信地址的大小并传出实际的大小。
         返回一个 新的socket描述符,专门用于信息的交互,失败返回-1.

       tcp协议和udp协议
           都是 传输层的协议,
           TCP是面向连接的协议,是可靠的
           需要保持连接,重发一切错误数据

           UDP 无连接协议,不可靠的
           不需要保持连接,不重发错误数据
           TCP 占内存比较多,效率偏低,
           UDP 占内存比较少,效率较高

    UDP编程有 专门的数据发送和接收函数:
       sendto()/recvfrom()

  • 相关阅读:
    uboot编译配置过程
    APUE-数据库函数库
    值得推荐的C/C++框架和库 (真的很强大)
    ubuntu12.04图形界面与命令行界面切换
    ubuntu14.04 升级gcc的方法
    4. H5+css3
    3,css 内容
    2. 浏览器兼容性问题
    1,http协议
    页面添加水印
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/3771184.html
Copyright © 2020-2023  润新知