问题 - 我正在处理流服务器并使用以下方法创建了一个非阻塞套接字:
flag=fcntl(m_fd,F_GETFL);
flag|=O_NONBLOCK;
fcntl(m_fd,F_SETFL,flag);
然后服务器使用代码发送媒体文件内容:
bool SendData(const char *pData,long nSize)
{
int fd=m_pSock->get_fd();
fd_set write_flag;
while(1)
{
FD_ZERO(&write_flag);
FD_SET(fd,&write_flag);
struct timeval tout;
tout.tv_sec=0;
tout.tv_usec=500000;
int res=select(fd+1,0,&write_flag,0,&tout);
if(-1==res)
{
print("select() failure\n");
return false;
}
if(1==res)
{
unsigned long sndLen=0;
if(!m_pSock->send(pData,nSize,&sndLen))
{
print(socket send() failure\n");
return false;
}
nSize-=sndLen;
if(!nSize)
return true; //everything is sent
}
}
}
使用上面的代码,我正在流式传输一个200秒的音频文件,我希望服务器应该使用完整的 n/w 可用带宽(油门关闭)在2-3 秒内传输它,但问题是服务器需要199~200 秒来流式传输完整的内容。在调试时,我评论了
m_pSock->发送()
部分 & 试图在本地转储文件。转储文件需要1~2 秒。
问题 - 如果我使用的是非阻塞 TCP 套接字,为什么send()需要这么多时间?
- 由于数据始终可用,因此select()将立即返回(正如我们在转储文件时看到的那样)。这是否意味着send()受客户端的recv()影响?
对此的任何投入都会有所帮助。客户行为不在我们的范围内。