socket 组播 求救!!!(40分)
大家看看我这段代码哪里有问题,怎么从组播网里收不到数据呢?哪里出现问题了!!??大家帮忙看看(这是客户端)
void main(void)
{
WSADATA wwsd;
SOCKADDR_IN local;
SOCKADDR_IN from;
ip_mreq mcast;
SOCKET sockM;
char recvbuf[BUFSIZE];
int len= sizeof(SOCKADDR_IN);
int optval;
int ret;
//启动服务
if(WSAStartup(MAKEWORD(1,1),&wwsd)!=0)
{
cout<<"WSAStartUp failed"<<endl;
return;
}
//创建套节字
if((sockM=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==INVALID_SOCKET)
{
cout<<"sockey failed"<<endl;
WSACleanup();
return;
}
BOOL bMultipleApps = TRUE; /* allow reuse of local port if needed */
if(setsockopt(sockM, SOL_SOCKET,SO_REUSEADDR, (char *)&bMultipleApps, sizeof(BOOL))==SOCKET_ERROR)
{
cout<<"setsockopt(SO_REUSEADDR) failed"<<endl;
closesocket(sockM);
WSACleanup();
return;
}
//设定数据传送时间
optval=8;
if(setsockopt(sockM,IPPROTO_IP,IP_MULTICAST_TTL,(char FAR *)&optval,sizeof(int))==SOCKET_ERROR)
{
cout<<"setsockopt (IP_MULTICAST_TTL) failed"<<endl;
closesocket(sockM);
WSACleanup();
return;
}
bLoopBack=FALSE;
if(bLoopBack)//设定回传
{
optval=0;
if(setsockopt(sockM,IPPROTO_IP,IP_MULTICAST_LOOP,(char FAR*)&optval,sizeof(optval))==SOCKET_ERROR)
{
cout<<"setsockopt(IP_MULTICAST_LOOP) failed"<<endl;
closesocket(sockM);
WSACleanup();
return;
}
}
local.sin_family=AF_INET;
local.sin_port =htons(5000);
local.sin_addr.s_addr =htonl(INADDR_ANY);
//邦定本地端口
if(bind(sockM,(SOCKADDR *)&local,sizeof(local))==SOCKET_ERROR)
{
cout<<"bind failed"<<endl;
closesocket(sockM);
WSACleanup();
return;
}
mcast.imr_multiaddr.s_addr=inet_addr("234.5.6.7"); //多播组地址
mcast.imr_interface.s_addr=htonl(INADDR_ANY); //本地地址
//加入组播组
if(setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char FAR *)&mcast,sizeof(mcast))==SOCKET_ERROR)
{
cout<<"setsockopt(IP_ADD_MEMBERSHIP) failed!"<<endl;
closesocket(sockM);
WSACleanup();
return;
}
dwCount=4;
bSender=false;
//接收数据
if(!bSender)
{
//Receive some data
//
for(i=0;i<dwCount;i++)
{
if((ret=recvfrom(sockM,recvbuf,BUFSIZE,0,(SOCKADDR *)&from, &len))==SOCKET_ERROR)
{
cout<<"recvfrom failed!"<<endl;
closesocket(sockM);
WSACleanup();
return;
}
recvbuf[ret]=0;
cout<<"Recv:"<<recvbuf<<" from"<<inet_ntoa(from.sin_addr);
}
}
//Drop group membership
//离开组播组
if(setsockopt(sockM,IPPROTO_IP,IP_DROP_MEMBERSHIP,(char *)&mcast,sizeof(mcast))==SOCKET_ERROR)
{
cout<<"setsockopt(IP_DROP_MEMBERSHIP) failed"<<endl;
}
//关闭注销套节字
closesocket(sockM);
//关闭服务
WSACleanup();
return;
}
问题点数:40、回复次数:9Top
1 楼chen_chen_silence()回复于 2006-06-01 15:02:00 得分 0
自己顶一下!Top
2 楼0delphi(睡个舒服觉)回复于 2006-06-01 15:24:56 得分 0
因为你只是客户端之接受
把 设置发送时间 和设定回转 那两段代码注释应该就可以了Top
3 楼0delphi(睡个舒服觉)回复于 2006-06-01 15:30:14 得分 5
更正一下
你是本机发送,本机接受吗?? 如果是在发送的时候要设置回转的
在接受的客户端就不要设置这些了Top
4 楼starytx(此地禁止大小便,违者没收工具!)回复于 2006-06-01 15:35:19 得分 35
cout<<"Recv:"<<recvbuf<<" from"<<inet_ntoa(from.sin_addr);出现了问题inet_ntoa(from.sin_addr);不对,你引掉就可以了Top
5 楼chen_chen_silence()回复于 2006-06-01 15:38:34 得分 0
感谢starytx(某某人) ,更改正确Top
6 楼0delphi(睡个舒服觉)回复于 2006-06-01 15:56:34 得分 0
这个问题把我搞蒙了
楼主把 地址 该成 224.1.1.1 就行了
换其它的好象都不行
等我找找原因Top
7 楼chen_chen_silence()回复于 2006-06-01 16:02:00 得分 0
0delphi(睡个舒服觉)不是拉,不过仍然谢谢你,多播的地址范围好像从224.0.0.0到239.255.255.255但是其中几个不能用Top
8 楼0delphi(睡个舒服觉)回复于 2006-06-01 16:15:09 得分 0
冷汗Top
9 楼0delphi(睡个舒服觉)回复于 2006-06-01 16:41:54 得分 0
出现了问题inet_ntoa(from.sin_addr);不对,你引掉就可以了
不好意思,不知道这样会出什么问题
Top




