win7无法接受组播数据
2个回答
展开全部
Windows 包含“媒体感知”功能。在使用传输控制协议/Internet 协议 (TCP/IP) 且基于 Windows 的计算机上,Windows 会检测网络媒体是否处于“链接状态”。只要 Windows 检测到媒体处于“故障”状态,它就会从该适配器中删除绑定的协议,直到检测到该适配器重新“正常工作”时为止。
你的异常应该就是Windows 检测检测不到正常造成的。也就是说你需要更改系统注册表以使系统网络适配器检测此状态。
(提醒下,修改注册表之前,一定要先进行备份,修改此注册表有一定风险,若因错误操作可能需要重装系统。步骤是微软提供的。)
要禁止网络适配器检测该链接状态,请按照下列步骤操作。
注意:NetBEUI 和 IPX 无法识别“媒体感知”。
使用注册表编辑器 (Regedt32.exe) 来查看下面的注册表项:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
添加以下注册表值:
数值名称:DisableDHCPMediaSense
数据类型:REG_DWORD - 布尔值
数值数据范围:0、1(False、True)默认值:0 (False)
说明:此参数控制 DHCP 媒体感知行为。如果将此数值数据设置为 1,DHCP(甚至非 DHCP)客户端就会忽略来自接口的媒体感知事件。默认情况下,媒体感知事件触发 DHCP 客户端执行操作,例如,试图获取租约(当发生连接事件时),或者使接口和路由无效(当发生连接断开事件时)。
重新启动计算机。
注意:在 Windows Server 2003 中,控制媒体感知的函数已添加到群集系统中。即使注册表中的 DisableDHCPMediaSense 未经设置或设置为 0 (False),群集系统也会将媒体感知更改为已禁用。随后,由于要启用媒体感知的系统的需要,DisableClusSvcMediaSense 注册表值被引入到 SP1 中。通过使用以下注册表子项,可以设置群集系统的控制函数的打开/关闭:
- 项:HKEY_LOCAL_MACHINE\Cluster\Parameters
- 数值名称:DisableClusSvcMediaSense
- 数据类型:REG_DWORD - 布尔值
- 数据范围:0、1(False、True)- 默认值:0 (False)。
DisableClusSvcMediaSense 默认值为 0 (False)。因此,控制函数处于打开状态,而媒体感知处于禁用状态。可以将 DisableClusSvcMediaSense 设置为 1 (True)。这样,控制函数变为关闭状态。之后,您便可以使用 DisableDHCPMediaSense 注册表项设置媒体感知的启用/禁用状态了。这与 Windows 2000 Server 中的群集环境类似。
注意:如果您禁用“媒体感知”功能,则可能会遇到一些问题。例如,假设您的计算机上安装了两个网络适配器,如果在您禁用“媒体感知”功能后,其中的一个网络适配器不能工作,则该适配器将取消绑定。此外,如果配置了默认网关,则会删除关联的路由,以使所有通信通过另一个网络适配器进行。
另举一例,当您从计算机上断开网络电缆时,如果禁用了“媒体感知”功能,则通知区域的“本地连接”图标将显示“网络电缆没有插好”状态消息。此外,当您运行“ipconfig”命令时,会收到“Media State .....:Cable Disconnected”消息。但在此情况下,网络适配器已绑定到 TCP/IP。要验证网络适配器是否已绑定到 TCP/IP,请查看路由表。要查看路由表,请使用“route print”命令。路由表可显示网络适配器的 IP 地址。还可以使用“ping”命令 ping 网络适配器的 IP 地址,以验证网络适配器是否已绑定到 TCP/IP。
你的异常应该就是Windows 检测检测不到正常造成的。也就是说你需要更改系统注册表以使系统网络适配器检测此状态。
(提醒下,修改注册表之前,一定要先进行备份,修改此注册表有一定风险,若因错误操作可能需要重装系统。步骤是微软提供的。)
要禁止网络适配器检测该链接状态,请按照下列步骤操作。
注意:NetBEUI 和 IPX 无法识别“媒体感知”。
使用注册表编辑器 (Regedt32.exe) 来查看下面的注册表项:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
添加以下注册表值:
数值名称:DisableDHCPMediaSense
数据类型:REG_DWORD - 布尔值
数值数据范围:0、1(False、True)默认值:0 (False)
说明:此参数控制 DHCP 媒体感知行为。如果将此数值数据设置为 1,DHCP(甚至非 DHCP)客户端就会忽略来自接口的媒体感知事件。默认情况下,媒体感知事件触发 DHCP 客户端执行操作,例如,试图获取租约(当发生连接事件时),或者使接口和路由无效(当发生连接断开事件时)。
重新启动计算机。
注意:在 Windows Server 2003 中,控制媒体感知的函数已添加到群集系统中。即使注册表中的 DisableDHCPMediaSense 未经设置或设置为 0 (False),群集系统也会将媒体感知更改为已禁用。随后,由于要启用媒体感知的系统的需要,DisableClusSvcMediaSense 注册表值被引入到 SP1 中。通过使用以下注册表子项,可以设置群集系统的控制函数的打开/关闭:
- 项:HKEY_LOCAL_MACHINE\Cluster\Parameters
- 数值名称:DisableClusSvcMediaSense
- 数据类型:REG_DWORD - 布尔值
- 数据范围:0、1(False、True)- 默认值:0 (False)。
DisableClusSvcMediaSense 默认值为 0 (False)。因此,控制函数处于打开状态,而媒体感知处于禁用状态。可以将 DisableClusSvcMediaSense 设置为 1 (True)。这样,控制函数变为关闭状态。之后,您便可以使用 DisableDHCPMediaSense 注册表项设置媒体感知的启用/禁用状态了。这与 Windows 2000 Server 中的群集环境类似。
注意:如果您禁用“媒体感知”功能,则可能会遇到一些问题。例如,假设您的计算机上安装了两个网络适配器,如果在您禁用“媒体感知”功能后,其中的一个网络适配器不能工作,则该适配器将取消绑定。此外,如果配置了默认网关,则会删除关联的路由,以使所有通信通过另一个网络适配器进行。
另举一例,当您从计算机上断开网络电缆时,如果禁用了“媒体感知”功能,则通知区域的“本地连接”图标将显示“网络电缆没有插好”状态消息。此外,当您运行“ipconfig”命令时,会收到“Media State .....:Cable Disconnected”消息。但在此情况下,网络适配器已绑定到 TCP/IP。要验证网络适配器是否已绑定到 TCP/IP,请查看路由表。要查看路由表,请使用“route print”命令。路由表可显示网络适配器的 IP 地址。还可以使用“ping”命令 ping 网络适配器的 IP 地址,以验证网络适配器是否已绑定到 TCP/IP。
展开全部
同问:我原来在XP下的程序在虚拟机上还能用,在WIN7下就不能了,能发送,而且能发给虚拟机上的程序,但Win7下相互以及虚拟机的XP上发出的Win7都收不到。
bool CMulticastSocket::CreateReceivingSocket(LPCTSTR strGroupIP, UINT nGroupPort)
{
if (!bSocketReady) return false;
if (!Socket(SOCK_DGRAM))
{
int nResult = GetLastError();
Close();
WSASetLastError(nResult);
return false;
}
bool bMultipleApps = true; /* allow reuse of local port if needed */
// int nOptionLength;
if(!SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(bool))) ShowErrorMessage();
// if(!GetSockOpt(SO_REUSEADDR, (void FAR*)&bMultipleApps, (int FAR*)&nOptionLength)) ShowErrorMessage();
// 下面这行在Release版会出错,且没有任何提示信息,不知道什么原因。
// if(!getsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (char FAR*)&bMultipleApps, (int FAR*)&nOptionLength)) ShowErrorMessage();
if(AsyncSelect(FD_READ)) ShowErrorMessage();
/* Fill m_saHostGroup_in for sending datagrams */
memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr(strGroupIP);
m_saHostGroup.sin_port = htons((USHORT)nGroupPort);
/* Join the multicast group */
m_mrMReq.imr_multiaddr.s_addr = inet_addr(strGroupIP); /* group addr */
m_mrMReq.imr_interface.s_addr = htons(INADDR_ANY); /* use default */
// create winsock SOCKET handle for data sending.
// if(m_SendSocket!=SOCKET_ERROR) closesocket(m_SendSocket);
// m_SendSocket=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// if(m_SendSocket==SOCKET_ERROR) {
// fprintf(stderr, "Creating `m_SendSocket' failed in (%s) @ line(%d).", __FILE__, __LINE__);
// }
if(setsockopt(m_hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&m_mrMReq, sizeof(m_mrMReq)) < 0)
return false;
int sock_reuse = 1;
if(setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&sock_reuse, sizeof(sock_reuse)) < 0)
return false;
if (!Bind(nGroupPort, NULL))
{
PrintError();
Close();
//ShowErrorMessage();
return false;
}
return true;
}
bool CMulticastSocket::CreateReceivingSocket(LPCTSTR strGroupIP, UINT nGroupPort)
{
if (!bSocketReady) return false;
if (!Socket(SOCK_DGRAM))
{
int nResult = GetLastError();
Close();
WSASetLastError(nResult);
return false;
}
bool bMultipleApps = true; /* allow reuse of local port if needed */
// int nOptionLength;
if(!SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(bool))) ShowErrorMessage();
// if(!GetSockOpt(SO_REUSEADDR, (void FAR*)&bMultipleApps, (int FAR*)&nOptionLength)) ShowErrorMessage();
// 下面这行在Release版会出错,且没有任何提示信息,不知道什么原因。
// if(!getsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (char FAR*)&bMultipleApps, (int FAR*)&nOptionLength)) ShowErrorMessage();
if(AsyncSelect(FD_READ)) ShowErrorMessage();
/* Fill m_saHostGroup_in for sending datagrams */
memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr(strGroupIP);
m_saHostGroup.sin_port = htons((USHORT)nGroupPort);
/* Join the multicast group */
m_mrMReq.imr_multiaddr.s_addr = inet_addr(strGroupIP); /* group addr */
m_mrMReq.imr_interface.s_addr = htons(INADDR_ANY); /* use default */
// create winsock SOCKET handle for data sending.
// if(m_SendSocket!=SOCKET_ERROR) closesocket(m_SendSocket);
// m_SendSocket=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// if(m_SendSocket==SOCKET_ERROR) {
// fprintf(stderr, "Creating `m_SendSocket' failed in (%s) @ line(%d).", __FILE__, __LINE__);
// }
if(setsockopt(m_hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&m_mrMReq, sizeof(m_mrMReq)) < 0)
return false;
int sock_reuse = 1;
if(setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&sock_reuse, sizeof(sock_reuse)) < 0)
return false;
if (!Bind(nGroupPort, NULL))
{
PrintError();
Close();
//ShowErrorMessage();
return false;
}
return true;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询