socket缓冲区已满,send会一直阻塞吗?
RT。 比如客户端在某个时间不再收取服务端的数据,而socket又不关闭。 那么服务端的socket缓冲区势必会累积满,此时继续send的话,会阻塞不返回吗?
之前碰到一个死锁问题就是这样导致的。客户端异常了出现上述问题,导致我的服务也挂起来,本来send完后释放锁,结果锁一直得不到释放。
这是我自己封装的函数,这个函数一直没有返回。
int CEvSocket::SendAll(int iSock, const void *pMsg, int iMsgLen)
{
if ((NULL == pMsg) || (iMsgLen <= 0))
{
return EV_ERR;
}
const char *pszMsgPos = (const char *)pMsg;
int iSendCnt = iMsgLen;
while (iSendCnt > 0)
{
int iSendSz = send(iSock, pszMsgPos, iSendCnt, 0);
if (iSendSz < 0)
{
return EV_ERR;
}
pszMsgPos += iSendSz;
iSendCnt -= iSendSz;
}
return EV_OK;
}