IPPROTO_RM在接受呼叫期间阻止

时间:2013-03-04 03:23:30

标签: c multicast winsock2 reliable-multicast

此问题与https://stackoverflow.com/questions/11650328/using-reliable-multicast-pragmatic-general-multicast-not-returning-from-accept类似,但我的代码与其略有不同,因此可能会产生不同的答案。

我正在尝试获得可靠的多播服务器/客户端概念验证设置。

解决方案本身是服务器/客户端连接。客户端通过TCP / IP连接到服务器。然后,服务器打开一个可靠的多播套接字供客户端监听。客户端通过TCP发送消息,服务器通过IPPROTO_RM回送它。最终目标是让许多客户端连接到服务器,所有客户端都接收每条回显消息。

示例代码基于此page

我已经设置了类似的RM套接字(参见下面的清单)。 TCP套接字工作正常。问题在于RM套接字。服务器打开多播套接字,然后bindsconnects正确打开多播地址。但是,客户端listens正确,但对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;

1 个答案:

答案 0 :(得分:1)

您是否安装了MSMQ(微软消息队列)? IPPROTO_RM需要在基于Ms的计算机上工作。此外,它仅适用于Windows版本> = Xp || 2003

编辑:我看到你已经检查了它。

相关问题