gpt4 book ai didi

sockets - Windows 7 组播接收在几分钟后停止接收

转载 作者:行者123 更新时间:2023-12-02 03:55:08 25 4
gpt4 key购买 nike

这是在 Windows 7 上用 C++ 编写的...我是多播套接字的新手,从其他人那里继承了这段代码。

我有这个系统,其中有多台计算机在 ADDR 225.1.1.2(为什么不)创建/加入多播套接字,一旦套接字连接,它们就会定期相互“聊天”,发送各种消息。如果我在网络上只启动一台计算机(称之为“A”)并让它每秒定期发送一次“keepalive”消息,但没有收到任何消息(没有其他人连接到多播地址),然后让它坐下大约 3 分钟,然后启动另一台计算机 B,第一台计算机 A 没有看到计算机 B 的广播消息! B 在发送数据包时没有出错,A 在接收任何东西时都没有出错(从不调用 receive)。我不知道如果某些东西正在关闭接收部分,我将如何获得通知,或者我将如何注册此类信息。

如果我启动彼此相对靠近的两台机器,每台机器都会看到另一台机器的 keepalive 数据包。接收发生在两台机器上。但是,同样,如果我在启动第一台计算机后超过 3 分钟启动第二台计算机,则第一台计算机的 Receive 方法似乎已经进入休眠状态,或者消失了,或者处于昏迷状态,或者其他什么。没有产生错误,但显然看不到机器 B 的数据包。 (另外,我在调试器输出中看到 3 个线程已退出,但它们不是我创建的线程,它们是系统线程)。但是最近启动的机器 B 确实看到了来自机器 A 的 keepalive 数据包。

这是套接字调用:

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));

这是我在互联网上看到的:

  1. 接收缓冲区可能已满。 (我不这么认为,因为计算机 A 是网络上唯一使用多播的计算机)
  2. 防火墙可以设置为在几分钟后关闭多播接收。 (我不相信)
  3. WinSock 协议(protocol)可以在 X 分钟不活动后关闭多播接收。 (我也不相信这个)

最佳答案

我认为你上面的代码有错误。我认为您必须为 imr_interface 指定计算机网络接口(interface)的本地 IP 地址(通常是计算机的 IP 地址,而不是多播地址)。也就是说,您要在其上发送/接收多播流量的接口(interface)。我假设您的代码根本没有加入多播组,它只是偶然工作了一段时间。

即使您根本无法调用 IP_ADD_MEMBERSHIP,它也可能会工作几分钟。

奇怪的 3 分钟行为听起来完全像是一个非工作加入或 IGMP 监听问题。

IPv4 多播非常微妙,主机、操作系统和中间硬件组件的行为也非常微妙。

当您的应用程序处理多播时,操作系统会发送和接收 IGMP 消息。这是自动的,依赖于对 IP_ADD_MEMBERSHIP 等的正确调用,但除此之外您无法控制它。中间硬件组件(WLAN 路由器、交换机、电力线适配器……)都发挥着神奇的作用使多播正常工作,而这种神奇的作用往往会隐藏问题并制造问题。

一个示例:如果您的进程为多播地址 X 调用 IP_ADD_MEMBERHIP,那么机器上的所有其他进程也将看到来自地址 X 的多播流量,即使它们未能调用 IP_ADD_MEMBERSHIP。

丢失(或伪造)ADD_MEMBERSHIP 的典型症状是:工作几分钟(通常为 3 到 5 分钟)然后突然停止工作,就好像电缆被拉了一样。在接下来的 3-5 分钟内,重新启动其中一个程序可再次解决问题。但是,即使 ADD_MEMBERSHIP 是 100% 正确的,您在穿越诸如电力线适配器之类的非平凡网络组件时也会出现此类症状。那么这是您使用的操作系统与您使用的路由器/交换机/适配器之间的某种不兼容。

要对此进行调试,请尝试检查主机操作系统的 IGMP 状态。不过,我不知道如何在 Windows 上执行此操作。

关于sockets - Windows 7 组播接收在几分钟后停止接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13018282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com