gpt4 book ai didi

c++ - 服务器非阻塞 TCP 套接字需要时间流式传输内容

转载 作者:行者123 更新时间:2023-11-28 08:01:26 24 4
gpt4 key购买 nike

问题- 我在流媒体服务器上工作并使用以下方法创建了一个非阻塞套接字:

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
}
}
}

使用上面的代码,我正在流式传输一个说 200sec 的音频文件,我希望服务器应该在 2-3secs 内使用完整的 n/w 可用带宽(节流),但问题是服务器需要 199~200 秒 来流式传输全部内容。在调试时,我评论了

m_pSock->send()

部分 & 试图在本地转储文件。转储文件需要 1~2 秒

问题- 如果我使用的是非阻塞 TCP 套接字,为什么 send() 花费这么多时间?

  • 由于数据始终可用,select() 将立即返回(正如我们在转储文件时看到的)。这是否意味着 send() 会受到客户端 recv() 的影响?

对此的任何输入都会有所帮助。客户行为不在我们的范围内。

最佳答案

您的客户端可能正在做一些缓冲以避免网络抖动,但它可能仍在实时播放音频文件。因此,文件传输速率与客户端使用数据的速率相匹配。由于它是一个 200 秒的音频文件,因此完成传输大约需要 200 秒。

关于c++ - 服务器非阻塞 TCP 套接字需要时间流式传输内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com