1. 套接字选项(socket options)
每一个套接字(socket)在不同的协议层次(级别)上面有不同的行为属性(选项)
我们可以设置 / 获取指定的套接字选项
getsockopt:获取套接字的选项
setsockopt:设置套接字的选项NAMEgetsockopt, setsockopt - get and set options on sockets SYNOPSIS#include <sys/types.h>#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);sockfd:你要设置或者获取属性的套接字描述符level:你要设置或者获取属性位于什么级别optname:选项名称optval:指针,指向一块空间get:指向的空间用来保存获取到的值set:指向的空间用来保存需要设置的值,把指定的值设置到socket上面去optlen:get:指针,调用前用来保存optval指向的空间的长度,调用后保存的是获取到的选项的实际大小(防止内存越界)set:变量,用来指定设定选项的选项值的长度返回值: 成功返回0,失败返回-1,同时errno被设置
获取指定的套接字的接收缓冲区大小,并重新设置该套接字的接收缓冲区大小
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h>int main() {// 申请一个套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) {perror("socket error");return -1;}int buflen;socklen_t len = sizeof(buflen);// 获取接收缓冲区大小int r = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (void *)&buflen, &len);if (r == 0) {printf("buflen = %d\n", buflen);}// 设置int val = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (void *)&val, sizeof(val));// 获取int on;socklen_t len2 = sizeof(on);r = getsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (void *)&on, &len2);if (r == 0) {printf("on = %d\n", on);}close(sockfd);return 0; }
设置套接字选项,允许端口号重用
2. 广播
一对多的通信
a. 只有当传输层协议为UDP(SOCK_DGRAM)时,才支持广播功能
TCP是端对端的连接,通信前需要进行三次握手建立连接
广播是一对多的通信
b. 广播的地址问题,如果发送广播,网络地址是哪里呢?
广播是向局域网中所有的主机发送信息
广播的地址是将IP地址中所有的主机号设置为1
即: xxx.xxx.xxx.255
例子:
你的IP:192.168.1.103
哪些是主机号你还不知道?
netmask:255.255.255.0
这个IP的局域网的广播地址是:192.168.1.255
你的IP:192.168.1.103
哪些是主机号你还不知道?
netmask:255.255.0.0
这个IP的局域网的广播地址是:192.168.255.255
3. 多播(multicast)
单播用于两个主机之间端对端的通信,广播用于一个主机对整个局域网上所有的主机进行数据通信
单播和广播是两个极端有时候,我们需要对一组特定的主机进行通信
=====>多播