扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇“linux服务器端发数据时对端一直不收怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux服务器端发数据时对端一直不收怎么解决”文章吧。
创新互联专业为企业提供乌翠网站建设、乌翠做网站、乌翠网站设计、乌翠网站制作等企业网站建设、网页设计与制作、乌翠企业网站模板建站服务,10年乌翠做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
对于这种情况,我们一般建议从以下几个方面来增加一些防御措施:
设置每路发送连接的发送缓冲区大小上限(如 2 M,或者小于这个值),当某路连接上的数据发送不出去的时候,即将数据存入发送缓冲区时,先判断一下缓冲区最大剩余空间,如果剩余空间已经小于我们要放入的数据大小,也就是说缓冲区中数据大小会超过了我们规定的上限,则认为该连接出现了问题,关闭该路连接并回收相应的资源(如清空缓冲区、回收套接字资源等)。示例代码如下:
//outputBuffer_为发送缓冲区对象
size_t remainingLen = outputBuffer_.remainingBytes();
//如果加入到缓冲区中的数据长度超出了发送缓冲区最大剩余量
if (remainingLen < dataToAppend.length())
{
forceClose()
return
}
outputBuffer_.append(static_cast(dataToAppend.c_str()), dataToAppend.length());
还有另外一种场景,当有一部分数据已经积压在发送缓冲区了,此后服务器端未产生新的待发送的数据,此时如果不做任何处理,发送缓冲区的数据会一直积压,但是发送缓冲区的数据容量也不会超过上限。如果不做任何处理的话,该数据会一直在缓冲区中积压,白白浪费系统资源。对于这种情况一般我们会设置一个定时器,每隔一段时间(如 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服务器端发数据时对端一直不收怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注创新互联行业资讯频道。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流