热门IT资讯网

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

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,这篇"linux服务器端发数据时对端一直不收怎么解决"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一

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

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

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

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

    outputBuffer_.append(static_cast(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服务器端发数据时对端一直不收怎么解决"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0