前幾天需要做乙個和第三方平台配套的單向通訊,反向隔離的通訊介面,原本確定是採用udp組播方式實現,通訊裝置中間加正向網路隔離裝置防止反通訊。我想著趕緊先行測試驗證一下,哪知我好不容易花了乙個下午編譯測試後,對接的廠家卻反饋說不再使用udp通訊,他們要用http方式,並不考慮兩個系統通訊隔離問題。我只能心裡不爽,但誰讓是我司求人配合呢,只好改用http實現,又趕了乙個工作日把http開發介面開發出來。
嗯,儲備過的知識不能丟,放到csdn上給予有需要的小夥伴也行。
udp傳送呼叫socket套接字實現很簡單,無非就是呼叫sendto函式傳送資訊,呼叫recvfrom函式接收資料,其關鍵點就是接收方需要繫結組播位址和埠,相當於加入組播,才能接收到資料。另外需要明確兩個概念,組播位址和本機位址,例如234.3.3.3和192.168.1.100.
以linux為例,展示其實現關鍵點
首先我們看下傳送方:
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);
下面看看接收方的實現
1)同樣是先構建socket
udp_socket = socket(af_inet, sock_dgram, 0);
2)繫結本機位址
3)加入組播,才能接收到組播資訊
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(mcast_ip.c_str());
if(local_ip.empty())else
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);
該例項我採用的編譯環境是centos7.3_x64/gcc4.8,win8_x64/vs2015,支援cmake配置
其中傳送端僅實現linux,接收端實現linux/win
linux下c 實現udp組播模式
組播 傳送的資訊,小組內所有成員都能同時接受到。組播發送端跟接收端的具體流程為 傳送方 a.建立socket socket fd socket af inet,sock dgram,0 if socket fd 0 b.設定傳送的群組的位址 set up the destination addres...
UDP組播接收
網路中的一台主機如果希望能夠接收到來自網路中其它主機發往某乙個組播組的資料報,那麼這麼主機必須先加入該組播組,然後就可以從組位址接收資料報。在廣域網中,還涉及到路由器支援組播路由等,但本文希望以乙個最為簡單的例子解釋清楚協議棧關於組播的乙個最為簡單明瞭的工作過程,甚至,我們不希望涉及到 igmp包。...
udp組播測試
這周主要做了udp組播的測試 伺服器傳送端 include include include include include include include include include include include include include include std string hello...