- 论坛徽章:
- 0
|
下面代码问题是,我为套接口设置接口地址为本地IP如"192.168.123.12"的时候,收不到返回的包,但是设置为INADDR_ANY时确可以,请问这个是为什么呢?
另:请问加入组播时设定的本地接口和发送组播消息时设定的组播接口有什么区别呢.
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#define MUTIADDR "234.0.1.1" //muticast address is 224.0.0.1~239.255.255.255
#define LOCALADDR "192.168.123.194"
#define MAXBUFF 256
#define MUTIPORT 5000
int main(int artc,char **argv)
{
int sock=-1;
struct sockaddr_in srv, recvc;
//////////////////////////////////////
struct ip_mreq mreq;
int r,n;
////////////////////////////////////
char buf[MAXBUFF];
bzero(&srv,sizeof(srv));
srv.sin_family = AF_INET;
srv.sin_port=htons(MUTIPORT);
inet_aton(MUTIADDR,&srv.sin_addr);
//sock=socket(AF_INET,SOCK_DGRAM,0);
////////////////////////////////////////////////////////////////////
struct sockaddr_in recvin;
bzero(&recvin,sizeof(recvin));
recvin.sin_family=AF_INET;
recvin.sin_port=htons(MUTIPORT);
//inet_aton(LOCALADDR,&recvin.sin_addr);
//这个地方设置为LOCALADDR不能收到返回的消息,但设置成INADDR_ANY确可以.
recvin.sin_addr.s_addr=htonl(INADDR_ANY);
int rfd=socket(AF_INET,SOCK_DGRAM,0);
bind(rfd,(struct sockaddr*)&recvin,sizeof(recvin));
//加入组
{
inet_aton(MUTIADDR,&mreq.imr_multiaddr);
//只要前面设置成INADDR_ANY,这里无论设置成什么都可以.
mreq.imr_interface.s_addr=htonl(INADDR_ANY);
//inet_aton(LOCALADDR,&mreq.imr_interface);
setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
//unsigned char loop = 0;
//setsockopt(rfd,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
///////////////////////////////////////////////////////////////////
}
while(fgets(buf,MAXBUFF,stdin))
{
if(sendto(rfd,buf,strlen(buf),0,(struct sockaddr*)&srv,sizeof(srv))<0)
{
perror("sendto");
}
else
{
fprintf(stdout,"ENVIADO A %s:%s",MUTIADDR,buf);
}
if((r=recvfrom(rfd,buf,MAXBUFF,0,NULL,NULL))>0)
{
buf[r]=0;
fprintf(stdout,"in message %s",buf);
printf("recv ok\n");
}
else
{
printf("recv error!\n");
}
}
}
[ 本帖最后由 idiotqxf 于 2007-1-25 15:22 编辑 ] |
|