谁知道IP多播通信中的源地址是怎么回事?

paer_1 2010-11-04 10:35:11
据说IP_ADD_SOURCE_MEMBERSHIP用于将指定的IP地址加入组中,并且只允许接受指定一个或更多的IP地址发来的消息.我看网上的许多代码中ip_mreq_source结构中的成员imr_sourceaddr与imr_interface被赋值为不同的网段上的IP地址。但如果是相同的网段上的IP地址是否可以建立通信呢?以下是我写的接受方的IP多播的通信代码:

SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
BOOL bReuse=TRUE;
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(const char*)&bReuse,sizeof(bReuse));

sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
addr.sin_addr.s_addr=INADDR_ANY;

if(SOCKET_ERROR==bind(s,(const sockaddr*)&addr,sizeof(addr)))
{
printf("绑定套接字失败\r\n");
getchar();
return -1;
}

ip_mreq_source im1;
im1.imr_interface.S_un.S_addr=INADDR_ANY;
im1.imr_multiaddr.S_un.S_addr=inet_addr("234.5.6.7");
im1.imr_sourceaddr.S_un.S_addr=inet_addr("172.30.52.211");
setsockopt(s,IPPROTO_IP,IP_ADD_SOURCE_MEMBERSHIP,(const char*)&im1,sizeof(im1));

//setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP,(const char*)&im,sizeof(im));

/*BOOL bLoop=FALSE;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,(const char*)&bLoop,sizeof(bLoop));*/
while(true)
{
int iRet;
char szBuf[1024];
sockaddr_in addrRemote;
int iSize=sizeof(addrRemote);
iRet=recvfrom(s,szBuf,1024,0,(sockaddr*)&addrRemote,&iSize);
if(SOCKET_ERROR!=iRet)
{
szBuf[iRet]='\0';
printf("接受到多播数据:%s\r\n",szBuf);

printf("发送方地址:%s 端口:%d\r\n",inet_ntoa(addrRemote.sin_addr),ntohs(addrRemote.sin_port));
}
}

发送方无非就是将目的地址指定为234.5.6.7,然后将TTL值设置为1,但是接受方无法收到消息。
...全文
386 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyh12345 2010-11-22
  • 打赏
  • 举报
回复
得在本机添加相应网段的ip地址
萧山夜雨 2010-11-22
  • 打赏
  • 举报
回复
但如果是相同的网段上的IP地址是否可以建立通信呢?
------
当然可以了

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧