这是 Windows 7 上的 C++ ......我有点像新手 Multicast Socket 人,并从其他人那里继承了这段代码。
我有这个系统,我有多台计算机在 ADDR 225.1.1.2 创建/加入多播套接字(为什么不),一旦套接字连接,它们会定期“聊天”彼此发送各种消息。如果我在网络上仅启动一台计算机(称为“A”)并让它每秒定期发送一次“keepalive”消息,但没有收到任何内容(没有其他人连接到多播地址),然后让它坐大约3分钟,然后启动另一台计算机B,第一台计算机A没有看到计算机B的广播消息!B 在发送数据包时没有出错,而 A 在接收任何内容时没有出错(从不调用接收)。如果某些东西正在关闭接收部分,我不知道如何获取通知,或者我如何注册此类信息。
如果我启动两台机器相对较近,每台机器都会看到对方的keepalive数据包。接收发生在两台机器上。但是,同样,如果我在启动第一台计算机 3 分钟后启动第二台计算机,第一台计算机的 Receive 方法似乎已经进入睡眠状态,或者消失了,或者处于昏迷状态,或者其他什么。没有产生错误,但是普通的不会看到机器 B 的数据包。(另外,我看到调试器输出中退出了 3 个线程,但它们不是我创建的线程,它们是系统线程)。但是最近启动的机器 B 确实看到了来自机器 A 的保活数据包。
这是套接字调用:
hSock = WSASocket(
AF_INET,
SOCK_DGRAM,
0,
NULL,
0,
WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_OVERLAPPED);
setsockopt(hSock,SOL_SOCKET,SO_REUSEADDR,(char *) &bVal,sizeof(bVal));
srcIP.sin_family=AF_INET;
// Need to bind to local interface
srcIP.sin_addr.s_addr=inet_addr(("225.1.1.2"); // htonl(INADDR_ANY);
srcIP.sin_port=htons(5555);
bind( hSock,(struct sockaddr FAR *) &srcIP,sizeof(srcIP) );
nIP_TTL=36;
setsockopt(hSock,IPPROTO_IP,IP_MULTICAST_TTL,(char *) &nIP_TTL,sizeof(int));
mreq.imr_multiaddr.s_addr=inet_addr("225.1.1.2");
mreq.imr_interface.s_addr=inet_addr("225.1.1.2");
setsockopt(hSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq,sizeof(mreq));
以下是我在网上看到的:
- 接收缓冲区可能已满。(我不这么认为,因为计算机 A 是网络上唯一使用多播的计算机)
- 防火墙可以设置为在几分钟后关闭多播接收。(我不相信这个)
- WinSock 协议可能会在 X 分钟不活动后关闭多播接收。(这个我也不信)