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

浙公网安备 33010602011771号