目录
一、udp通信
前几天需要做一个和第三方平台配套的单向通信,反向隔离的通信接口,原本确定是采用UDP组播方式实现,通信设备中间加正向网络隔离装置防止反通信。我想着赶紧先行测试验证一下,哪知我好不容易花了一个下午编译测试后,对接的厂家却反馈说不再使用udp通信,他们要用http方式,并不考虑两个系统通信隔离问题。我只能心里不爽,但谁让是我司求人配合呢,只好改用http实现,又赶了一个工作日把http开发接口开发出来。
嗯,储备过的知识不能丢,放到CSDN上给予有需要的小伙伴也行。
udp发送调用socket套接字实现很简单,无非就是调用sendto函数发送信息,调用recvfrom函数接收数据,其关键点就是接收方需要绑定组播地址和端口,相当于加入组播,才能接收到数据。另外需要明确两个概念,组播地址和本机地址,例如234.3.3.3和192.168.1.100.
二、实现代码逻辑
以linux为例,展示其实现关键点
2.1 发送方
首先我们看下发送方:
1)构造socket
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
//如果需要绑定,记得绑定本地地址
2)指定发送的组播地址和端口
struct sockaddr_in mcast_addr;
memset(&mcast_addr, 0, sizeof(mcast_addr));
mcast_addr.sin_family = AF_INET;
mcast_addr.sin_addr.s_addr = inet_addr(mcast_ip.c_str());
mcast_addr.sin_port = htons(mcast_port);
3)发送组播数据
//it为组播数据内容描述
int n = sendto(udp_socket, it.c_str(), it.length(),0,(struct sockaddr*)&mcast_addr,sizeof(mcast_addr));
4)关闭socket
close(udp_socket);
2.2 接收方
下面看看接收方的实现
1)同样是先构建socket
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
2)绑定本机地址
//
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//local_addr.sin_addr.s_addr = inet_addr(local_ip.c_str());//指定发送的网口
local_addr.sin_port = htons(mcast_port);
//建立本地捆绑(主机地址/端口号)
int err = -1;
err = bind(udp_socket,(struct sockaddr*)&local_addr, sizeof(local_addr));
3)加入组播,才能接收到组播信息
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(mcast_ip.c_str());
if(local_ip.empty()){
mreq.imr_interface.s_addr = htonl(INADDR_ANY); //任意接口接收组播信息
}else{
mreq.imr_interface.s_addr = inet_addr(local_ip.c_str()); //指定接口接收组播信息
}
err = setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
4)接收数据
sockaddr_in srv_Addr;//用于存储发送方信息
socklen_t addr_len = sizeof(srv_Addr);
char *buff = new char[buf_size];
memset(buff, 0, buf_size);
n = recvfrom(udp_socket, buff, buf_size, 0,(struct sockaddr*)&srv_Addr,&addr_len);
5)使用完后可以退出组播,关闭socket
err = setsockopt(udp_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
close(udp_socket);
三、完整源代码及测试配置
完整的udp实例可以去我的下载资源下载udp_test.zip
udp_test.zip_c++组播通信-网络基础代码类资源-CSDN下载
该实例我采用的编译环境是centos7.3_x64/gcc4.8,win8_x64/vs2015,支持cmake配置
其中发送端仅实现linux,接收端实现linux/win