UDP广播数据的收发 注意要点

现在网上很多资料,可以找到UDP数据接收的参考范例,但这些范例都少了关键的一个步骤,使得使用起来,都无法正确接收组播的UDP数据。

下面是本人在实际项目中,总结出来的参考代码,按照这个几本过程,可以实现在Linux和VC下面编写App,正确的收到网络上的UDP数据。

首先是建立socket,bind socket,基本上网上这些操作的代码都差不多,参考如下:

address.sin_family = AF_INET;

address.sin_addr.s_addr = INADDR_ANY; // inet_addr("127.0.0.1");

address.sin_port=htons(giport);

isocket_des=socket(AF_INET,SOCK_DGRAM,0);


if ( INVALID_SOCKET == isocket_des )

{

//printf("Cound not create socket : %d\n",geterror());

perror("socket create error:");

return;

}


if ( SOCKET_ERROR == bind(isocket_des,(struct sockaddr *)&address,sizeof(address)))

{

//printf("UDP socket bind faild witch error coade is : %d\n",geterror());

perror("bind error:");

return;

}

以上的代码用于linux的GCC,如果要用于VC,也就打印错误代码的函数不同而已。

很多资料都没有下面这个关键的步骤,必须通过下面的步骤加入组播,才可以收到UDP组播的数据:

mreq.imr_interface.s_addr = htonl(INADDR_ANY);

//targetAddr.sin_addr.s_addr = inet_addr("239.255.42.42");

mreq.imr_multiaddr.s_addr = inet_addr("239.255.42.42");//targetAddr.sin_addr.s_addr;

//inet_aton("239.255.42.42",&mreq.imr_multiaddr.s_addr);

通过上面的数据,设置组播IP地址,并用setsockopt函数,加入组播。


if ( setsockopt(isocket_des, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0 )

{

//printf("set socket error with error code is : %d \n",geterror());

perror("set socket port error:"); // need excute cmd "route add -net 224.0.0.0 netmask 224.0.0.0 eth0" at cmd pompt window

return;

}

printf("waiting for UDP incomming connectiong...\n");

接下来,就可以用recvfrom这个函数接收网络上的UDP数据了

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值