读书人

多播有关问题

发布时间: 2012-02-13 17:20:26 作者: rapoo

多播问题高手请进!
多播如何响应接受?我从服务器往客户端发信息以多播形式发送,但是客户端没有响应,不知道什么原因,OnReceive响应多播吗?请高手指教,最好有源代码可以参考,我刚接触网络希望可以说明白点谢谢~~~~~~~~~~~!!

[解决办法]
客户端首先得加入多播组,然后才能收到多播消息
[解决办法]
你需要在客户端专门收一下多播数据
[解决办法]
我的多播客户端接收多播消息的代码是这样的
int nlen = sizeof( AddrMulticast );
int ret = recvfrom( UDPMultiSoc, lpMsg, buffLen, 0 , (sockaddr *)&AddrMulticast, (int *)&nlen );

其中 UDPMultiSoc 的初始化如下:
long retval = 0x00000000;
//Init udp receive multicast sock
if( ( UDPMultiSoc = GetMulticastSock( lpMultiAddr ) ) != INVALID_SOCKET ) {
retval |= 0x00000002;
}

lpMultiAddr 是多播地址

static SOCKET GetMulticastSock( const char * lpMultiAddr ) {
struct ip_mreq ipmr = { 0 };
sockaddr_in localAddr = { 0 };
SOCKET Soc = WSASocket( AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED );
if( Soc != INVALID_SOCKET ) {
memset( &localAddr, 0, sizeof( sockaddr_in ) );
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY) /* inet_addr( lpMultiAddr ) */;
localAddr.sin_port = htons( UDP_MULTI_PORT );
if( bind( Soc, (struct sockaddr*)&localAddr, sizeof( localAddr ) ) != SOCKET_ERROR ) {
ipmr.imr_multiaddr.s_addr = inet_addr( lpMultiAddr );
ipmr.imr_interface.s_addr = htonl( INADDR_ANY );
if( setsockopt( Soc, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&ipmr, sizeof( ipmr ) ) != SOCKET_ERROR ) {
memset( &AddrMulticast, 0, sizeof( sockaddr_in ) );
AddrMulticast.sin_family = AF_INET;
AddrMulticast.sin_addr.s_addr = inet_addr( lpMultiAddr );
AddrMulticast.sin_port = htons( UDP_MULTI_PORT );
} else {
Soc = INVALID_SOCKET;
}
} else {
Soc = INVALID_SOCKET;
}
}
return( Soc );
}

读书人网 >VC/MFC

热点推荐