如何进行一对多的 UDP 数据发送?
广播是向同一网络中的所有主机传输数据的方法
广播类型
区别:
DHCP (动态主机配置协议) 是一个局域网的网络协议 (基于 UDP 协议)
DHCP 采用 客户端/服务器 模型,地址的动态分配由网络主机驱动
工作方式:

本地主机想要获取 IP 地址,首先会在本地广播一个数据包,源IP地址为0.0.0.0,目标IP地址为255.255.255.255,DHCP 服务器收到此数据包后,会回复本地主机;本地主机获取到的 IP 地址是有期限的,快到期限的时候,本地主机会继续广播,请求继续使用此 IP 地址。
socket 的本质是对本机网络资源的一种标识
socket 本身有各种属性 (不同的连接,属性可能不同)
通过 setsockopt() / getsockopt() 可存取指定 socket 的属性值
socket 属性的改变可造成 socket 数据收发行为的改变




编程实验
server.c
- #include
- #include
- #include
- #include
- #include
-
- int main()
- {
- int server = 0;
- struct sockaddr_in addr = {0};
- struct sockaddr_in remote = {0};
- char buf[128] = "D.T.SoftWare\n";
- int len = 0;
- int brd = 1;
-
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
- addr.sin_port = htons(8888);
-
- remote.sin_family = AF_INET;
- remote.sin_addr.s_addr = inet_addr("192.168.197.255");
- // remote.sin_addr.s_addr = 0xFFFFFFFF;
- remote.sin_port = htons(6666);
-
- server = socket(PF_INET, SOCK_DGRAM, 0);
-
- if(server < 0)
- {
- printf("server socket error\n");
-
- return -1;
- }
-
- if(bind(server, (struct sockaddr*)&addr, sizeof(addr)) == -1)
- {
- printf("udp server bind error\n");
-
- return -1;
- }
-
- setsockopt(server, SOL_SOCKET, SO_BROADCAST, &brd, sizeof(brd));
-
- printf("udp server start success!\n");
-
- while(1)
- {
- len = sizeof(remote);
-
- sendto(server, buf, strlen(buf), 0, (struct sockaddr*)&remote, len);
-
- sleep(1);
- }
-
- close(server);
-
- return 0;
- }
client.c
- #include
- #include
- #include
- #include
- #include
-
- int main()
- {
- int sock = 0;
- struct sockaddr_in remote = {0};
- struct sockaddr_in addr = {0};
- char buf[128] = {0};
- int r = 0;
- socklen_t len = 0;
-
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
- addr.sin_port = htons(6666);
-
- if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- {
- printf("client socket error\n");
-
- return -1;
- }
-
- if(bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0)
- {
- printf("udp client bind errpr\n");
-
- return -1;
- }
-
- while(1)
- {
- len = sizeof(remote);
-
- r = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*)&remote, &len);
-
- if(r > 0)
- {
- buf[r] = 0;
-
- printf("Receive: %s\n", buf);
- }
- }
-
- close(sock);
- }
192.168.197.xxx网段下的所有6666端口的进程都能够收到广播。
UDP 是否还有其他一对多的数据发送方式?