玩命加载中 . . .

4.5-UDP和本地Socket


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: 地址的内存大小
// 成功返回发送的字节数,失败返回-1
=============================================

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
                struct sockaddr *src_addr, socklen_t *addrlen);
- sockfd: 通信的fd
- buf: 接受数据的数组
- len: buf的大小
- flags: 0
- src_addr: 保存另外一端的地址信息,不需要就指定为NULL
- addrlen: 地址内存大小
// 成功返回接收到的字节数,失败返回-1

广播

向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1

  • 只能在局域网中使用
  • 客户端需要绑定服务器广播使用的端口,才可以接收到广播消息
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
- sockfd: 文件描述符
- level: 级别,SOL_SOCKET
- optname: SO_BROADCAST
- optval: 1表示允许广播
- optlen: optval的大小

组播(多播)

单播地址标识单个IP接口,广播地址标识某个子网的所有IP接口,多播地址标识一组IP接口。单播和广播是寻址方案的两个极端。多播数据报只应该由对他感兴趣的接口接收,也就是由运行相应多播会话应用系统的主机上的接口接收。广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用

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

// 客户端加入到多播组
- level: IPPROTO_IP
- optname: IP_ADD_MEMBERSHIP
- optval: struct mreqn

struct ip_mreq {
    struct in_addr imr_multiaddr;   // 组播的IP地址
    struct in_addr imr_interface;   // 本地的IP地址
};

本地套接字

本地的进程间通信,进程有没有关系都可以

>>>>>>>>>>>>>>>>>>>>>>>服务器流程<<<<<<<<<<<<<<<<<<<<<<<
// 1. 创建监听的套接字
int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
// 2. 绑定本地的套接字文件
struct sockadd_un addr;
bind(lfd, addr, len);
// 绑定成功之后,指定的sun_path中的套接字文件会自动生成
// 3. 监听客户端连接
listen(lfd, 100);
// 4. 等待连接请求
struct sockaddr_un cliaddr;
int cfd = accept(lfd, cliaddr, len);
// 5. 通信
接收数据: read/recv
发送数据: write/send
// 6. 关闭连接
close();


>>>>>>>>>>>>>>>>>>>>>>>客户端流程<<<<<<<<<<<<<<<<<<<<<<<
// 1. 创建监听的套接字
int fd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);
// 2. 绑定IP和端口
struct sockadd_un addr;
bind(lfd, addr, len);
// 3. 连接服务器
struct sockaddr_un serveraddr;
connect(fd, &serveraddr, sizeof(serveraddr));
// 4. 通信
// 5. 关闭连接
close();

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录