这个问题类似于https://stackoverflow.com/questions/11650328/using-reliable-multicast-pragmatic-general-multicast-not-returning-from-accept,但我的代码与它略有不同,因此可能会得到不同的答案。
我正在尝试建立一个可靠的多播服务器/客户端概念验证。解决方案本身是一个服务器/客户端连接。客户端通过TCP/IP连接到服务器。然后,服务器打开一个可靠的多播套接字供客户端侦听。客户端通过TCP发送消息,服务器通过
示例代码基于此page。
我已经类似地设置了我的RM套接字(请参见下面的列表)。TCP套接字正常工作。问题出在RM套接字上。服务器打开多播套接字,然后正确地绑定和连接到多播地址。然而,客户端正确地侦听,但调用accept会永久阻塞。
客户端和服务器进程都在同一主机上运行。
我已经检查过,主机(Server 2008)安装了多播支持。
更新: 我注意到有时候只要在发送方先通过套接字发送一些数据,就能使接受方正常返回。这并不理想,也不可靠。 更新: 迹象表明问题出在交换机上。看来一个小型集线器已经不足以应对了。我们发生了一件很滑稽的事故,导致整个楼宇失去了通信。
我正在尝试建立一个可靠的多播服务器/客户端概念验证。解决方案本身是一个服务器/客户端连接。客户端通过TCP/IP连接到服务器。然后,服务器打开一个可靠的多播套接字供客户端侦听。客户端通过TCP发送消息,服务器通过
IPPROTO_RM
将其回显。最终目标是让许多客户端连接到服务器,所有客户端都接收到每个回显消息。示例代码基于此page。
我已经类似地设置了我的RM套接字(请参见下面的列表)。TCP套接字正常工作。问题出在RM套接字上。服务器打开多播套接字,然后正确地绑定和连接到多播地址。然而,客户端正确地侦听,但调用accept会永久阻塞。
客户端和服务器进程都在同一主机上运行。
我已经检查过,主机(Server 2008)安装了多播支持。
更新: 我注意到有时候只要在发送方先通过套接字发送一些数据,就能使接受方正常返回。这并不理想,也不可靠。 更新: 迹象表明问题出在交换机上。看来一个小型集线器已经不足以应对了。我们发生了一件很滑稽的事故,导致整个楼宇失去了通信。
列表
服务器创建并连接多播发送器
short
Port = 0;
const char
*Address = "234.5.6.7";
SOCKET
RMSocket;
SOCKADDR_IN
LocalAddr,
SessionAddr;
RMSocket = socket(AF_INET, SOCK_RDM, IPPROTO_RM);
if (RMSocket == INVALID_SOCKET)
{
return Failed;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons(0);
LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if ( bind( RMSocket, (SOCKADDR*)&LocalAddr, sizeof(LocalAddr)) == SOCKET_ERROR )
{
return Failed;
}
SessionAddr.sin_family = AF_INET;
SessionAddr.sin_port = htons( Port );
SessionAddr.sin_addr.s_addr = inet_addr( Address );
if ( connect( RMSocket, (SOCKADDR*)&SessionAddr, sizeof(SessionAddr)) == SOCKET_ERROR )
{
return Failed;
}
return Success;
客户端创建并接受组播读取器
short
Port = 0;
const char
*Address = "234.5.6.7";
SOCKADDR_IN
LocalAddr;
SOCKET
RMListener,
RMSocket;
RMListener = socket( AF_INET, SOCK_RDM, IPPROTO_RM );
if ( RMListener == INVALID_SOCKET )
{
return Failed;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons( Port );
LocalAddr.sin_addr.s_addr = inet_addr( Address );
if ( bind( RMListener, (SOCKADDR*)&LocalAddr, sizeof(LocalAddr) ) )
{
return Failed;
}
if ( listen( RMListener, SOMAXCONN ) )
{
return Failed;
}
// BLOCKS HERE
RMSocket = accept( RMListener, NULL, NULL);
if ( RMSocket == INVALID_SOCKET )
{
return Failed;
}
return Success;