• Linux网络编程III


    1.UDP通信
    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
        - sockfd: 通信的fd
        - buf: 要发送的数据
        - len: 要发送的数据长度
        - flags: 0
        - dest_addr: 通信的另外一端地址信息
        - addrlen: 地址的内存大小
     
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
        - sockfd: 通信的fd
        - buf: 接收数据的数组,传出参数
        - len: 数组大小
        - flags: 0
        - dest_addr: 通信的另外一端地址信息,不需要可以指定为NULL
        - addrlen: 地址的内存大小
    

      

     
    2.广播
    • 向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,主机号部分的二进制全部为1。
    • 只能在局域网中使用。
    • 客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。
    // 设置广播属性的函数
    int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
        - sockfd : 文件描述符
        - level : SOL_SOCKET
        - optname : SO_BROADCAST
        - optval : int类型的值,为1表示允许广播
        - optlen : optval的大小
    

     

    3.多播
    • 既可以用于局域网,也可以用于广域网
    • 客户端需要加入多播组,才能接受到多播的数据
    /
    / 服务器设置多播的信息,外出接口
    int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
        - level: IPPROTO_IP
        - optname: IP_MULTICAST_IF
        - optval: struct in_addr    
     
    // 客户端加入多播地址
    int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
        - level: IPPROTO_IP
        - optname: IP_ADD_MEMBERSHIP
        - optval: struct ip_mreq
     
    struct ip_mreq {
        struct in_addr imr_multiaddr;        // 组播的IP地址
        struct in_addr imr_interface;        // 本地的IP地址
    };
     
    typedef uint32_t in_addr_t;
     
    struct in_addr {
        in_addr_t s_addr;
    };
    

      

    4.本地套接字:本地的进程间通信。
    • 有关系的进程间通信
    • 无关系的进程间通信
    • 本地套接字实现与网络套接字实现类似,一般使用TCP协议
    • 过程:
      • 服务器端:
        • 创建监听的套接字  AF_UNIX / AF_LOCAL
        • 监听的套接字绑定本地的套接字文件  struct sockaddr_un addr;  绑定成功后指定的 sun_path 中的套接字文件会自动生成   bind(fdl, addr, len);
        • 监听  listen(fdl, 100);
        • 等待连接并接受请求  int fdc = accept(fdl, &cliaddr, len);
        • 通信 read/write
        • 关闭连接 close()
      • 客户端:
        • 创建通信的套接字
        • 监听的套接字绑定本地的IP端口
        • 连接服务器   connect(fd, &serveraddr, sizeof(serveraddr));
        • 通信 read/write
        • 关闭连接 close()
    #include <sys/un.h>
    #define UNIX_PATH_MAX 108
    struct sockaddr_un {
    sa_family_t sun_family; // 地址族协议 af_local
    char sun_path[UNIX_PATH_MAX]; // 套接字文件的路径, 这是一个伪文件, 大小永远=0
    };
     
    strcpy(addr.sun_path, "server.sock");
    

      

     
  • 相关阅读:
    shell脚本中判断上一个命令是否执行成功
    nginx 414 Request-URI Too Large
    nginx 重写URL尾部斜杠
    Linux shell 日期,时间相关的命令
    shell脚本中自定义日志记录到文件
    scanf后面跟一个getchar
    1.Tarball软件make与makefile详解(还需要补充)
    <>和“”的区别
    malloc,calloc,realloc,alloc
    toString()方法细节
  • 原文地址:https://www.cnblogs.com/tristatl/p/15120703.html
Copyright © 2020-2023  润新知