问题 - 我的工作流服务器&上创建使用非阻塞套接字:服务器的非阻塞TCP套接字抽出时间来传输内容
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秒音频文件,我期望服务器应该在2-3secs使用全N/W可用带宽(节气门关闭),但问题是,服务器正在199〜200secs到流全部内容。 调试时,我评论了
m_pSock->发送()
部分&试图在本地转储文件。需要1〜2secs转储文件。
问题 - 如果我使用非阻塞的TCP套接字,为什么的send()采取这么多的时间?
- 由于数据始终可用,选择()将立即返回(因为我们而倾倒文件看到)。这是否意味着send()受客户端上的recv()影响?
任何对此的投入将是helpul。客户行为不在我们的范围内。
TCP套接字大小为64KB,但我将32KB。我想这增加至1MB及获得25-30%的提高,但仍然服务器不流,因为它应该在油门做关闭模式(即2〜3秒最大为15 MB的文件假设)。刚刚经过测试,当客户端请求服务器时,需要0-2毫秒才能开始流式传输。 – user1409528 2012-07-06 06:35:40
什么是“节流”应该是什么意思?当你在select()中超时时,你的代码做了什么?您如何知道客户端以尽可能快的速度接收数据,并且不使用流量控制来限制带宽? – nos 2012-07-06 06:37:51
在Streaming中关闭意味着Server将发送获取最大可用带宽的内容。如果启用了Throttle,服务器将根据Frame TimeStamp值发送内容(即在必须显示Frame之前发送Frame)。在Throttle情况下,服务器应该在“文件持续时间”内流式传输内容。我已经写了一个sepearte代码的案例工作正常的油门。对于上面的代码,我假设超时永远不会发生,因为我们已经在函数中有数据。 – user1409528 2012-07-06 06:50:19