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