大家看看我这段代码哪里有问题,怎么从组播网里收不到数据呢?哪里出现问题了!!??大家帮忙看看(这是客户端)
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;
}

解决方案 »

  1.   

    cout<<"Recv:"<<recvbuf<<"   from"<<inet_ntoa(from.sin_addr);出现了问题inet_ntoa(from.sin_addr);不对,你引掉就可以了
      

  2.   

    感谢starytx(某某人) ,更改正确
      

  3.   

    0delphi(睡个舒服觉)不是拉,不过仍然谢谢你,多播的地址范围好像从224.0.0.0到239.255.255.255但是其中几个不能用
      

  4.   

    出现了问题inet_ntoa(from.sin_addr);不对,你引掉就可以了不好意思,不知道这样会出什么问题