GS给客户单发包以及m_queGcWait(所有GC共享)
send_stat BaseChannel::SendCmd(int nCmd, void* pData, int nLen)
{
Protocol Ptl;
Ptl.cmd_type = nCmd;
Ptl.content = pData;
Ptl.size = nLen;
void* tmpBuffer = ms_pSendBuff2C; if (nLen > __GC_MAX_SEND_BUFF_LEN)
{
ShuiHu::GetLogger()->Fatal( "【%s(%d行)】严重错误,发送cmd=%d包,包长度(%d)比最大发送包(%d)更大 ",
__FUNCTION__, __LINE__, nCmd, nLen, __GC_MAX_SEND_BUFF_LEN);
safe::error_msg("GC发送包长度过长!");
} int nSize = Ptl.to_buffer(tmpBuffer, __GC_MAX_SEND_BUFF_LEN);//打包到tmpBuffer
if(- == nSize)
return send_stat::send_parameter_error; DataPkt Pkt;
//此处用内存池有个问题,加入共享内存一直pop不出来,这个内存迟早会用完,有个缓冲队列好好处是没发送出去你可以返回去干其他的事情,等下次去发送
//所以此处需要重新分配内存去保存包内容,内存池的好处就是重复的new,delete
//我看了下他这个pop如果用完了他是重新new的,这还差不多,不然要等待扯犊子了
Pkt.pData = m_pShare->PopPkt(nSize);//GC共享内存池中分配一块内存
Pkt.nSize = nSize;
memcpy(Pkt.pData, tmpBuffer, nSize); m_queCmd.push(Pkt);//发到命令缓冲中 return SendCmdTry();
} send_stat BaseChannel::SendCmdTry()//只能这样说每个GC每发送一个包,他都企图把它所有剩余的包发送出去
{
if (!m_queCmd.size())
return send_stat::send_succeed; for(;;)
{
if (m_queCmd.empty())
break;
DataPkt pkt = m_queCmd.front(); {
send_stat hr = m_pDataLayer->SendData(m_nChannelId, pkt.pData, pkt.nSize);//发给网络层
if(hr != send_stat::send_succeed)//没发送成功,说明发送端的共享内存用完了(有个疑问为什么不把共享内存弄大一点)
{
//放入等待队列,让GS来发送(有个问题为什么要让GS发送,发送失败直接返回,下次再发送就是了)
m_pShare->PushGcWait(m_nChannelId);//将其放到未发送的所有GC共享队列中去
return hr;
}
} m_queCmd.pop();//说明发送成功 m_pShare->PushPkt(pkt.pData, pkt.nSize);//归还共享内存
}
return send_stat::send_succeed;
}

GS给客户单发包以及m_queGcWait(所有GC共享)的更多相关文章

  1. Git客户单for Windows

    1.GItHub for Windows  可参考:http://www.ihref.com/read-16514.html

  2. NGINX转发代理情况下,获取客户单真实IP

    编译时加上http_realip_module 模块 realip模块生效的前提是:直接连接nginx的ip是在set_real_ip_from中指定的. 原机配置: set_real_ip_from ...

  3. node基础学习——http基础知识-01-客户单请求

    <一> HTTP基础createServer()相关事件介绍 1. 创建HTTP服务器 server = http.createServer([requestListener]) // 下 ...

  4. 002-创建型-03-单例模式(Singleton)【7种】、spring单例及原理

    一.概述 保证一个类仅有一个实例,并提供一个全局访问点 私有构造器.线程安全.延迟加载.序列化和反序列化安全.反射攻击 1.1.适用场景 1.在多个线程之间,比如servlet环境,共享同一个资源或者 ...

  5. Spring工作原理与单例

    最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...

  6. Spring对象类型——单例和多例

    由于看淘淘商城的项目,涉及到了项目中处理spring中bean对象的两种类型,分别是单例和多例,就在此记录一下,方便加深理解,写出更加健壮的代码. 一.单例和多例的概述 在Spring中,bean可以 ...

  7. JVM系列.JDK演进历史

    Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...

  8. 13_Python的面向对象编程-类class,对象object,实例instance

    1.面向对象概述 1.类是用来描述对象的工具,把拥有相同属性和行为的对象分为一组     2.对象是由类实例化出来的一个具体的对象         属性: 对象拥有的名词,用变量表示         ...

  9. 玩转直播系列之RTMP协议和源码解析(2)

    一.背景 实时消息传输协议(Real-Time Messaging Protocol)是目前直播的主要协议,是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议. ...

随机推荐

  1. hdu 2521 反素数(打表)

    反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. ++x和x++

    #include <stdio.h> int main() { int a,b,c=1,d=1; a = c++; b = ++d; printf("%d\t%d\n" ...

  3. 用Gson解析没有数据头的纯数组json字符串

    无数据头Json字符串 Json字符串只有数组,而次数组没有名字,如下 [ { "name": "zhangsan", "age": &qu ...

  4. Android Studio中删除所有的断点

    直接上图,我相信你们能看的懂,骚年们. 第1个图:Run–>>View Breakpoints.. 第2个图:现在可以看到所有的断点了,在左侧栏全选,然后点"-",就全 ...

  5. 4C 2018 福到了

    输入字符c(只含有@和空格).数字n.规模n*n的二维字符矩阵. 若倒过来的数组和原数组一样形式输出提示. 最后输出以字符c替换的字符数组. #include <bits/stdc++.h> ...

  6. 参数化1--jmeter参数化数据(_csvread函数、用户自定义变量等)

    以下是转载内容,仔细看过后,觉得用得最多的应该是csvread函数.用户自定义变量以及CSV DATA CONFIG控制器这几个,但是做练习之后,在结果树和聚合报告中怎么查看执行结果是个问题,没找到对 ...

  7. asp.net简单定时任务实现

    代码如下: public class TimeTask { #region 单例 private static TimeTask _task = null; public static TimeTas ...

  8. go语言学习之路六:接口详解

    Go语言没有类和继承的概念,但是接口的存在使得它可以实现很多面向对象的特性.接口定义了一些方法,但是这些方法不包含实现的代码.也就是说这些代码没有被实现(抽象的方法).同时接口里面也不包含变量. 看一 ...

  9. redis--服务器与客户端

    初始化服务器 从启动 Redis 服务器,到服务器可以接受外来客户端的网络连接这段时间,Redis 需要执行一系列初始化操作. 整个初始化过程可以分为以下六个步骤: 初始化服务器全局状态. 载入配置文 ...

  10. [置顶] zabbix发送告警

    之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...