日期:2014-05-19  浏览次数:21049 次

Socket怎么加入组播组啊?
最近用C#中的Socket进行通讯编码。
但是发现在用Socket进行接受组播的时候,因为组播地址不是本地的127.0.0.1所以无法绑定。接受不料组播数据包。
代码如下:

                                IPEndPoint   ipEndPoint   =   new   IPEndPoint(System.Net.IPAddress.Parse(multiIPAddress),   mutilUdpPort);
                                udpReceiveMutilVideoSocket   =   new   Socket(System.Net.Sockets.AddressFamily.InterNetwork,   System.Net.Sockets.SocketType.Dgram,   System.Net.Sockets.ProtocolType.Udp);
                                udpReceiveMutilVideoSocket.Bind(ipEndPoint);                      

在Bind的时候,告诉我说,远程主机地址无法绑定。

我也想过用UdpClient,但是UdpClient没有延时设置,如果万一给组播地址发送组播数据包的机器挂了,我这个UdpClient不是一直在那里等待接受数据包吗?这样下来,程序就down在那里啦!

哪位用过用Socket进行接受组播数据包的,指点下啊,谢谢!本人学习C#不到10天啊,大家帮帮忙啊,项目紧急啊,必须尽快解决啦!没有办法啦!



------解决方案--------------------
这个例子很详细,估计够你用了:

http://www.codeproject.com/cs/internet/multicast.asp

E文文章,注册可下源代码.
------解决方案--------------------
//发送方程序 sender.c

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define BUFFSIZE 2048
#define IP_ADDR "224.8.8.1 "
#define DEST_PORT 8888

int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in addr;
char szError[100];
char buf[] = "Hello, World! ";
int ttl = 255 ; // Arbitrary TTL value.

WSADATA WSAData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup (wVersionRequested , &WSAData) != 0)
{
printf ( "recver:Initialize Winsock error! ");
exit(1);
}
if (LOBYTE(WSAData.wVersion) != 2 || HIBYTE(WSAData.wVersion) != 2 ) {
WSACleanup( );
printf ( "setsockopt failed! Error: %d ", WSAGetLastError ());
exit(1);
}

addr.sin_family = AF_INET;
addr.sin_port = htons(DEST_PORT);
addr.sin_addr.s_addr = inet_addr(IP_ADDR);

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf( "sender:new a socket error!\n ");
exit(1);
}

if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl))!=0)
{
printf( "error setsockopt IP_MULTICAST_TTL\n ");
exit(1);
}
/*
if (bind(sockfd,(struct sockaddr *)&recver_addr,sizeof(recver_addr)) < 0) {
closesocket(sockfd);
printf( "recver:bind socket error!\n ");
exit(1);
}
*/