2017年本科毕业,经历过千辛万苦的找工作之后,我进入了现在的这家公司。虽是职场小白,但励志成为IT界的一股清流(毕竟开发的妹子少,哈哈)。因为公司的业务需要,我负责的部分是利用组播技术实现OSG模型的多人协同操作,简单来说就是,在n个多播组中,无论任何一个成员操作模型,其所在组内的其他成员的模型也会随之改变。   

  udp技术就不多说了,度娘都有,我的理解就是一对多的通信模式。我采用的是C/S架构,客户端和服务器不再是傻瓜式的收-发-收-发模式,而是像我们日常用QQ群、微信群一样,一方可以毫无顾忌的发送消息(传说中的索命连环call),也可以接受到其他成员的,部分核心代码如下:

  客户端加入到多播组:

 #define PORT 9999
#define BUF_SIZE 1024 int main()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(, ), &wsaData) != )
{
cout << "Failed to load Winsock dll" << WSAGetLastError();
} SOCKET clientSock = socket(AF_INET, SOCK_DGRAM, );//创建套接字
if (clientSock == INVALID_SOCKET)
{
cout << "socket()Failed:" << WSAGetLastError();
} sockaddr_in servAddr;//地址信息
memset(&servAddr, , sizeof(servAddr));
servAddr.sin_addr.s_addr = inet_addr("192.168.0.121");
servAddr.sin_family = AF_INET; servAddr.sin_port = htons(PORT);
int len = sizeof(servAddr);
char sendBuf[BUF_SIZE] = { };//缓冲区初始化为0 if (sendto(clientSock, sendBuf, BUF_SIZE, , (sockaddr*)&servAddr, len) == SOCKET_ERROR)
{
cout << "send failed ,error is:" << WSAGetLastError() << endl;
}
else
{
cout << "send successfully:" << sendBuf << endl;
} //加入到多播组
bool loop = ;
if (setsockopt(clientSock, IPPROTO_IP, IP_MULTICAST_LOOP, reinterpret_cast<char FAR *>(&loop), sizeof(loop)) < )
{
cout << "set sock error" << endl;
return false;
}
struct ip_mreq mreq;
mreq.imr_multiaddr.S_un.S_addr = inet_addr(groupIP.c_str());
mreq.imr_interface.s_addr = inet_addr(myIP.c_str());
setsockopt(clientSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<char FAR *>(&mreq), sizeof(mreq));
}

  自定义发送和接收函数:(敲黑板:接收函数有亮点,发现没,设置接收时间的巧妙之处在哪呢?请见下回分解,哈哈)

 //服务器也可以发送消息,调用下SendMessage函数即可

 void SendMessage(string str, sockaddr_in addr)
{
char * send_buff = new char[str.length() + ];
strcpy(send_buff, str.c_str()); if (sendto(SerSocket, send_buff, str.length() + , , (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
cout << "failed to send the msg , with the error is : " << WSAGetLastError() << endl;
return;
}
}
 //客户端不光是发送请求的一方,也是接收消息的一方

  bool recvMsg(string &str, int ms)  //规定时间内接收
{
char recvBuf[BUF_SIZE] = { }; //初始化缓冲区 int len = sizeof(servAddr);
int timer = ; int SocketError;
while (timer <= ms)
{
if(recvfrom(clientSock, recvBuf, BUF_SIZE, , (sockaddr*)&servAddr, &len) == SOCKET_ERROR)
{
SocketError = WSAGetLastError();
if (SocketError != WSAEWOULDBLOCK)
{
cout << endl << "socket error is:" << SocketError << endl << endl;
}
++timer;
}
else
{
str = recvBuf;
cout << "receive from server:" << str.c_str() << endl;
return true;
}
Sleep();
}
if (timer > ms)
{
return false;
}
}

  网络编程,socket的头文件不要忘了哦

 #include<WinSock2.h>
#include<ws2tcpip.h>
#include<iostream>
#pragma comment ( lib,"ws2_32.lib" )
using namespace std;

  第一次写博客,排版什么的还不太懂,如果文中有什么不正确的地方,还望各位大佬指教,谢谢啦~

调皮的udp组播技术的更多相关文章

  1. QT的UDP组播技术

    一 UDP介绍 UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输.适合下面4种情况: 网络数据大多为短消息. 拥有大量客户端. 对数据安全性无特殊要求 网络负担非常重,但对响应速度要 ...

  2. IP组播技术介绍及实现例子

    引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...

  3. Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...

  4. HCNP Routing&Switching之组播技术-组播基础

    组播技术背景 随着internet网络的不断发展,网络中交互的各种数据.语音.视频信息数量突增:新型的在线直播.网络电视.视频会议等应用也在逐渐兴起:这些业务大多符合点到多点的模式,对信息安全性.传播 ...

  5. HCNP Routing&Switching之组播技术PIM-SM RP

    前文我们了解了组播技术中,组播路由协议PIM的稀疏模式相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16142795.html:今天我们来聊一聊组播路 ...

  6. ffmpeg笔记——UDP组播接收总结

    ffmpeg在avformat_open_input里面已经实现了UDP的协议,所以只需要设置好参数,将url传递进去就可以了. 和打开文件的方式基本一样: 01 AVCodecContext *pV ...

  7. IP组播技术

      1  概述 1.1  产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...

  8. C# 使用UDP组播实现局域网桌面共享

    最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类 ...

  9. Android上UDP组播无法接收数据的问题

    最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...

随机推荐

  1. package.json文件解析

    1.用途:管理你所安装的npm包的依赖,在开发过程中能清楚的查询安装的包的版本以及项目中使用的包依赖,便于开发组成员共享. 2.创建:可以手动创建也可以通过npm init 自动创建. 3.配置项: ...

  2. JS 实现右下角弹窗

    <!DOCTYPE HTML> <head> <title>JS实现右下角弹窗</title> <meta http-equiv="co ...

  3. Java Base64位加密和解密(包括其他加密参考)

    链接https://blog.csdn.net/longguangfu8/article/details/78948213 常用加密解密算法[RSA.AES.DES.MD5]介绍和使用 https:/ ...

  4. C语言博客作业6---结构体&文件

    C语言博客作业6---结构体&文件 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容.如下图所示: 1.2.学习体会 描述本周学习感受,也可以在这里提出你不理解地方.对 ...

  5. QT中QMainWindow、QWidget、QDialog

    QT中QMainWindow.QWidget.QDialog 简述 在分享所有基础知识之前,很有必要在这里介绍下常用的窗口-QWidget.QDialog.QMainWindow. 熟悉Qt的同学都应 ...

  6. MQTT项目请求设置

    MQTT项目请求设置:XMLHttpRequest WithCredentials 1.如果在发送来自其他域的XMLHttpRquest请求之前,未设置withCredentiaals为true,那么 ...

  7. 七、Python-正则表达式

    一.正则式表达式语法 正则表达式是一种用来匹配字符串的强有力的武器,设计思想是一种描述性的语言来给字符串定义一个规则,烦死符合规则的字符串,就认为它匹配,否则不匹配 行定位符:用来描述字符串的边界 ^ ...

  8. Kafka(2)--kafka基本原理之消息的分发与接收

    关于 Topic 和 Partition Topic 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合.每条消息发送到 kafka 集群的消息都有一个类别.物理上来说, ...

  9. Vue初接触 stage1

    开始学Vue辣!哈哈哈哈哈真的好好玩啊Vue!这个写法我真的太爱了! stage1 4-27 先写一下安装Vue devtools时遇到的问题(说来神奇,我是写第一个实例的时候试着在控制台打印了这个空 ...

  10. 虚拟机上安装django链接Pycharm(版本差异有所差异)

    第一,启动虚拟机,配置好虚拟机 第二,workon查看安装那些虚拟环境 第三,创建虚拟环境命令:mkvirtualenv -p /usr/bin/ python3 my_djangou 第四,进入虚拟 ...