开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (2)
master
3531D_ENC5
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (2)
master
3531D_ENC5
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (2)
master
3531D_ENC5
Encoder
/
GroupRPC.cpp
Encoder
/
GroupRPC.cpp
GroupRPC.cpp 5.26 KB
一键复制 编辑 原始数据 按行查看 历史
LinkPi 提交于 2018年04月12日 15:57 +08:00 . 增加视频混合、usb摄像头
#include "GroupRPC.h"
#include <QNetworkInterface>
#include <sys/socket.h>
#include <QEventLoop>
#include <QTimer>
#include <QMetaMethod>
#define GRP_REQUEST "request"
#define GRP_RESPOND "respond"
uint GroupRequest::nextSeq=0;
GroupRequest::GroupRequest(QObject *parent) : QObject(parent)
{
seq=nextSeq++;
}
GroupRPC::GroupRPC(QObject *parent) : QObject(parent),socket(this)
{
timeout=200;
connect(&socket,SIGNAL(readyRead()),this,SLOT(onRead()));
groupId=0;
port=5432;
}
bool GroupRPC::init(int p)
{
port=p;
updateNet();
if(!socket.bind(port))
return false;
socket.setSocketOption(QUdpSocket::SendBufferSizeSocketOption,1024*1024);
socket.setSocketOption(QUdpSocket::ReceiveBufferSizeSocketOption,1024*1024);
return true;
}
void GroupRPC::updateNet()
{
QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();
for(int i = 0; i < nets.count(); i ++)
{
if(!nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
{
localMac = nets[i].hardwareAddress();
QList<QNetworkAddressEntry> addrs = nets[i].addressEntries();
for(int k=0;k<addrs.count();k++)
{
if(addrs[k].ip()!=QHostAddress::LocalHost && addrs[k].ip().protocol()==QAbstractSocket::IPv4Protocol)
{
localIp = addrs[k].ip();
}
}
break;
}
}
}
void GroupRPC::addMethod(QString name, QObject *obj, const char *method)
{
objectMap[name]=obj;
methodMap[name]=method;
}
QVariant GroupRPC::call(QString method, QString to, QVariant data, bool noRespond)
{
GroupRequest *request=new GroupRequest();
requestList.append(request);
QVariantMap msg;
msg["from"]=localMac;
msg["to"]=to;
msg["groupId"]=groupId;
msg["seq"]=request->seq;
msg["method"]=method;
msg["type"]=GRP_REQUEST;
msg["data"]=data;
if(to!=localMac)
{
send(msg);
if(to=="any")
{
fromIp=localIp;
callbak(msg);
}
}
else
{
return callbak(msg);
}
if(!noRespond)
{
QEventLoop loopLoad;
QTimer timer;
QObject::connect(request,SIGNAL(respond()), &loopLoad, SLOT(quit()));
QObject::connect(request,SIGNAL(respond()), &timer, SLOT(stop()));
QObject::connect(&timer, SIGNAL(timeout()), &loopLoad, SLOT(quit()));
timer.start(timeout);
loopLoad.exec();
if(timer.isActive())
{
timer.stop();
qDebug()<<"timeout";
}
}
requestList.removeAll(request);
request->deleteLater();
return request->ret;
}
QString GroupRPC::getLoaclMac()
{
return localMac;
}
void GroupRPC::setGroupId(int gid)
{
groupId=gid;
}
QHostAddress GroupRPC::getFromIp()
{
return fromIp;
}
QHostAddress GroupRPC::getLocalIp()
{
return localIp;
}
QString GroupRPC::getFromMac()
{
return fromMac;
}
QVariant GroupRPC::callbak(QVariantMap msg)
{
fromMac=msg["from"].toString();
QString method=msg["method"].toString();
msg["to"]=msg["from"];
msg["from"]=localMac;
msg["type"]=GRP_RESPOND;
QVariant ret;
QVariant data=msg["data"];
int retType=0;
for(int i=0;i<objectMap[method]->metaObject()->methodCount();i++)
{
if(objectMap[method]->metaObject()->method(i).name()==method)
{
retType=objectMap[method]->metaObject()->method(i).returnType();
}
}
if(retType!=43)
{
if(!data.isNull())
QMetaObject::invokeMethod(objectMap[method],methodMap[method],Qt::DirectConnection,Q_RETURN_ARG(QVariant,ret),Q_ARG(QVariant,data));
else
QMetaObject::invokeMethod(objectMap[method],methodMap[method],Qt::DirectConnection,Q_RETURN_ARG(QVariant,ret));
msg["data"]=ret;
if(msg["to"]!=localMac)
send(msg);
else
return ret;
}
else
{
if(!data.isNull())
QMetaObject::invokeMethod(objectMap[method],methodMap[method],Qt::DirectConnection,Q_ARG(QVariant,data));
else
QMetaObject::invokeMethod(objectMap[method],methodMap[method],Qt::DirectConnection);
}
return ret;
}
void GroupRPC::send(QVariantMap &msg)
{
QByteArray json=QJsonDocument::fromVariant(msg).toJson();
socket.writeDatagram(json,QHostAddress::Broadcast,port);
}
void GroupRPC::onRead()
{
while(socket.hasPendingDatagrams())
{
QByteArray ba;
ba.resize(socket.pendingDatagramSize());
socket.readDatagram(ba.data(),ba.size(),&fromIp);
QVariantMap msg=QJsonDocument::fromJson(ba).toVariant().toMap();
if(!msg.contains("to"))
continue;
if(msg["from"].toString()==localMac || (msg["to"].toString()!=localMac && msg["to"].toString()!="any") || msg["groupId"].toInt()!=groupId)
continue;
QString type=msg["type"].toString();
if(type==GRP_REQUEST)
{
callbak(msg);
}
else if(type==GRP_RESPOND)
{
foreach(GroupRequest *req,requestList)
{
if(req->seq==msg["seq"].toUInt())
{
req->ret=msg["data"];
emit req->respond();
}
}
}
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/jtela/Encoder.git
git@gitee.com:jtela/Encoder.git
jtela
Encoder
Encoder
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /