Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Windows 7多播接收在几分钟后停止接收 这是在Windows 7上的C++。我是一个新手,从别人那里继承了这段代码_Sockets_Multicast - Fatal编程技术网

Sockets Windows 7多播接收在几分钟后停止接收 这是在Windows 7上的C++。我是一个新手,从别人那里继承了这段代码

Sockets Windows 7多播接收在几分钟后停止接收 这是在Windows 7上的C++。我是一个新手,从别人那里继承了这段代码,sockets,multicast,Sockets,Multicast,我有一个系统,在这个系统中,我有多台计算机在ADDR 225.1.1.2上创建/加入一个多播套接字(为什么不),一旦套接字连接,它们就会定期“聊天”,彼此发送各种消息。如果我只启动网络上的一台计算机(称为“A”),并让它每秒定期发送一次“keepalive”消息,但没有收到任何消息(没有其他人连接到多播地址),并让它保持大约3分钟,然后启动另一台计算机B,第一台计算机A看不到来自计算机B的广播消息!B在发送数据包时没有收到错误,A在接收任何数据包时没有收到错误(从不调用receive)。我不知道

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

如果我启动这两台机器时彼此相对靠近,那么每台机器都会看到另一台机器的保留数据包。在两台机器上都会发生接收。但是,同样,如果我在启动第一台计算机3分钟后启动第二台计算机,第一台计算机的接收方法似乎已进入睡眠状态,或消失,或处于昏迷状态,或其他状态。没有生成错误,但plain不会看到机器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));
以下是我在互联网上遇到的情况:

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

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

    即使你根本没有打电话给IP_ADD_会员,它也可能会工作几分钟

    奇怪的3分钟行为听起来很像一个不工作的连接或IGMP窥探问题

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

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

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

    缺少(或伪造)ADD_成员资格的典型症状是:它工作几分钟(通常为3到5分钟),然后突然停止工作,就好像电缆被拉了一样。重新启动其中一个程序可在接下来的3-5分钟内再次修复该问题。但是,即使有100%正确的ADD_成员身份,当您通过一个非平凡的网络组件(如电力线适配器)时,也会出现这种症状。那么这就是您正在使用的操作系统和您正在使用的路由器/交换机/适配器之间的某种不兼容

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