关于多播通信的疑问
当实现多播通信时,为什么接受方与发送方在同一台主机时,发送方发送一个消息时,接受方会接受到三个消息。而接受方与发送方在不同主机时,发送方发送一个消息时,接受方只会接受到一个消息。以下是我写的代码:
发送方:
接受方:
发送方:
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
addr.sin_addr.s_addr=INADDR_BROADCAST;
SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(INVALID_SOCKET==s)
{
printf("创建套接字失败\r\n");
getchar();
return -1;
}
BOOL bBroadCast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadCast,sizeof(bBroadCast));
printf("开始向端口4567上发送数据\r\n");
char szBuf[]="Hello everyone!\r\n";
while(true)
{
sendto(s,szBuf,strlen(szBuf),0,(const sockaddr*)&addr,sizeof(addr));
Sleep(5000);
}
closesocket(s);
接受方:
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
addr.sin_addr.s_addr=INADDR_ANY;
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==s)
{
printf("创建套接字失败\r\n");
getchar();
return -1;
}
if(SOCKET_ERROR==bind(s,(const sockaddr*)&addr,sizeof(addr)))
{
printf("绑定套接字失败\r\n");
getchar();
return -2;
}
printf("开始在端口4567上监听数据...\r\n");
while(true)
{
char szBuf[1024];
sockaddr_in addrRemote;
int iSize=sizeof(addrRemote);
int iLen=recvfrom(s,szBuf,strlen(szBuf),0,(sockaddr*)&addrRemote,&iSize);
if(iLen!=SOCKET_ERROR)
{
szBuf[iLen]='\0';
printf("接受到广播数据:%s\r\n",szBuf);
printf("远程地址;%s 端口:%d\r\n",
inet_ntoa(addrRemote.sin_addr),ntohs(addrRemote.sin_port));
}
}
closesocket(s);
...全文
相关推荐
多播通信技术
### 多播通信技术详解#### 一、理解多播通信的原理与优势多播通信技术是一种在多个接收者间高效传输数据的网络通信模式,尤其适用于需要同时向大量接收者发送信息的场景,如多媒体网络教学、数字电话会议、分布式数据库等
AI算力网络多播通信的6个常见问题解答
想象一下,你是一家“AI蛋糕店”的老板,要同时给100个顾客做同款蛋糕。如果每个顾客的蛋糕都要单独烤一次,烤箱(算力)和面粉(数据)都会被大量浪费。这时候,你需要一台“魔法烤箱”——能同时烤100个蛋糕,只需要一份面粉和一次加热。AI算力网络中的多播通信,就像这台“魔法烤箱”。在AI训练中(比如GPT这样的大模型),大量计算节点(GPU/TPU)需要同步数据(如梯度、参数),传统的“单播”(一对一传输)会导致数据在网络中重复传输,浪费带宽;
理解SAE-J1939协议
J1939协议在CAN基础之上增加了更多的功能和复杂性,如地址分配、网络管理、多播通信等。
多播通信 加入多播组
该项目实现了基于Winsock的IP多播通信,包含初始化套接字环境和加入多播组的功能。通过C++类封装Winsock启动与释放,并利用套接字选项进行多播成员管理,支持发送和接收多播数据,适用于Wind
多播通信方法和设备.zip
本文将深入探讨多播通信的方法、原理及其在实际设备中的应用。多播通信的核心在于多播地址,这些地址是IPv4或IPv6地址的一部分,它们被设计用来标识一组接收者,而不是单个主机。


网络编程
