温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

linux服务器端发数据时对端一直不收怎么解决

发布时间:2022-05-09 14:37:31 来源:亿速云 阅读:144 作者:iii 栏目:大数据

这篇“linux服务器端发数据时对端一直不收怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux服务器端发数据时对端一直不收怎么解决”文章吧。

对于这种情况,我们一般建议从以下几个方面来增加一些防御措施:

  1. 设置每路发送连接的发送缓冲区大小上限(如 2 M,或者小于这个值),当某路连接上的数据发送不出去的时候,即将数据存入发送缓冲区时,先判断一下缓冲区最大剩余空间,如果剩余空间已经小于我们要放入的数据大小,也就是说缓冲区中数据大小会超过了我们规定的上限,则认为该连接出现了问题,关闭该路连接并回收相应的资源(如清空缓冲区、回收套接字资源等)。示例代码如下:

    //outputBuffer_为发送缓冲区对象
    size_t remainingLen = outputBuffer_.remainingBytes();
    //如果加入到缓冲区中的数据长度超出了发送缓冲区最大剩余量
    if (remainingLen < dataToAppend.length())
    {
    forceClose()
    return
    }

    outputBuffer_.append(static_cast<const char*>(dataToAppend.c_str()), dataToAppend.length());
  2. 还有另外一种场景,当有一部分数据已经积压在发送缓冲区了,此后服务器端未产生新的待发送的数据,此时如果不做任何处理,发送缓冲区的数据会一直积压,但是发送缓冲区的数据容量也不会超过上限。如果不做任何处理的话,该数据会一直在缓冲区中积压,白白浪费系统资源。对于这种情况一般我们会设置一个定时器,每隔一段时间(如 3 秒)去检查一下各路连接的发送缓冲区中是否还有数据未发送出去,也就是说如果一个连接超过一定时间内还存在未发送出去的数据,我们也认为该连接出现了问题,我们可以关闭该路连接并回收相应的资源(如清空缓冲区、回收套接字资源等)。示例代码如下:

    //每3秒检测一次
    const int SESSION_CHECK_INTERVAL = 3000;

    SetTimer(SESSION_CHECK_TIMER_ID, SESSION_CHECK_INTERVAL);

    void CSessionManager::OnTimer()
    {
       for (auto iter = m_mapSession.begin(); iter != m_mapSession.end(); ++iter)
       {
           if (!CheckSession(iter->value))
           {
               //关闭session,回收相关的资源
               iter->value->ForceClose();

               iter = m_mapSession.erase(iter);
           }
       }
    }

    void CSessionManager::CheckSession(CSession* pSession)
    {
       if (!pSession->GetConnection().OutputBuffer.IsEmpty())
           return false;

       return true;
    }

以上就是关于“linux服务器端发数据时对端一直不收怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI