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");

  

 
原文地址:https://www.cnblogs.com/tristatl/p/15120703.html