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数据了。

相关主题
相关文档
最新文档