能否通过TCP向255.255.255.255发送广播数据包?
问题:如何用TCP实现类似UDP广播的功能?
我正在学习广播(broadcast)与多播(multicast)技术,了解到借助UDP可以向255.255.255.255发送广播数据包,但想知道如何通过TCP实现相同操作?
以下是我的UDP代码:
#include <iostream> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { const char* broadcastAddress = "255.255.255.255"; int broadcastPort = 12345; // Use a specific port number int udpSocket = socket(AF_INET, SOCK_DGRAM, 0); if (udpSocket == -1) { perror("Failed to create socket"); return 1; } // Enable broadcasting on the socket int broadcastEnable = 1; if (setsockopt(udpSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)) == -1) { perror("Failed to enable broadcasting"); // close(udpSocket); return 1; } // Set up the destination address struct sockaddr_in broadcastAddr; memset(&broadcastAddr, 0, sizeof(broadcastAddr)); broadcastAddr.sin_family = AF_INET; broadcastAddr.sin_addr.s_addr = inet_addr(broadcastAddress); broadcastAddr.sin_port = htons(broadcastPort); // Message to broadcast const char* message = "This is a broadcast message"; // Send the message to the broadcast address if (sendto(udpSocket, message, strlen(message), 0, (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr)) == -1) { perror("Failed to send broadcast message"); } // Close the socket close(udpSocket); return 0; }
我尝试将代码中的SOCK_DGRAM改为SOCK_STREAM以实现TCP连接,但运行程序后未发送任何数据包,后台运行的Wireshark也未捕获到相关数据包。
解答
核心结论:TCP本身不支持广播/多播操作
TCP是面向连接的一对一可靠协议,通信前必须完成三次握手,建立与单个特定主机的双向连接。而广播是一对多的无连接通信,不存在一个能代表“网络内所有主机”的实体来响应TCP的连接请求,这两者的设计本质冲突,因此TCP没有原生的广播/多播机制。
你修改代码后无数据包的原因
当你把SOCK_DGRAM改为SOCK_STREAM后,代码逻辑完全不符合TCP的工作流程:
- TCP无法向
255.255.255.255广播地址发起connect请求——没有任何主机会监听广播地址的连接,三次握手根本无法完成 - 即使你强行调用
sendto,由于没有建立有效TCP连接,系统会直接丢弃数据,不会产生任何网络数据包
实现类似广播效果的TCP替代方案
如果必须依赖TCP的可靠性来实现一对多通信,只能通过以下两种方式模拟:
- 遍历局域网IP逐个建立连接:扫描局域网内所有可能的主机IP段(比如
192.168.1.1到192.168.1.254),对每个存活的主机单独建立TCP连接并发送数据 - 搭建中间转发服务器:所有接收端预先和中心服务器建立TCP连接,发送端只需将数据发送给服务器,再由服务器转发给所有在线的接收端
补充建议
如果没有必须使用TCP的硬性要求,UDP的广播/多播是更适配一对多通信场景的方案——你的原始UDP代码是正确的,能够正常完成广播功能。
内容的提问来源于stack exchange,提问作者Mayank
相关产品推荐
相关产品推荐

