[英]Server's NonBlocking TCP socket taking time to stream content
问题 -我正在使用流服务器,并使用以下命令创建了一个非阻塞套接字:
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〜200secs到流全部内容。 在调试时,我评论了
m_pSock-> send()
部分并尝试在本地转储文件。 转储文件需要1到2秒 。
问题 -如果我使用的是NonBlocking TCP套接字,为什么send()需要这么多时间?
任何对此的投入将是有帮助的。 客户行为不在我们的范围之内。
您的客户端可能正在做一些缓冲以避免网络抖动,但是它可能仍会实时播放音频文件。 因此,文件传输速率与客户端使用数据的速率匹配。 由于它是200秒的音频文件,因此大约需要200秒才能完成传输。
因为TCP输出和输入缓冲区的大小可能比音频文件小得多,所以接收应用程序的读取速度可能会降低发送速度。
当发送方的TCP输出缓冲区和接收方的输入缓冲区都已满时,发送方的TCP堆栈将无法从发送方接收任何数据。 因此,发送将被阻止,直到有空间为止。
如果接收方读取TCP流,则与播放数据所需的速度相同。 然后,转移大约需要200秒。 或少一点。
可以通过在接收端使用应用程序层缓冲来避免这种情况。
问题可能是,如果客户端使用阻塞式TCP,加上正在处理单个线程上的所有数据而没有缓冲区/队列等,一直到文件的“播放器”,则您的非阻塞端将只能加快速度,直到达到TCP / IP协议堆栈缓冲区,NIC缓冲区等已满的程度。 这样,您最终仍然只能以客户端使用数据时的速度发送数据。 请记住,TCP是可靠的点对点协议。
客户代码来自哪里? 是某人编写的某种简单的测试客户端吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.