2012-07-06 73 views
0

问题 - 我的工作流服务器&上创建使用非阻塞套接字:服务器的非阻塞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。客户行为不在我们的范围内。

+0

TCP套接字大小为64KB,但我将32KB。我想这增加至1MB及获得25-30%的提高,但仍然服务器不流,因为它应该在油门做关闭模式(即2〜3秒最大为15 MB的文件假设)。刚刚经过测试,当客户端请求服务器时,需要0-2毫秒才能开始流式传输。 – user1409528 2012-07-06 06:35:40

+0

什么是“节流”应该是什么意思?当你在select()中超时时,你的代码做了什么?您如何知道客户端以尽可能快的速度接收数据,并且不使用流量控制来限制带宽? – nos 2012-07-06 06:37:51

+0

在Streaming中关闭意味着Server将发送获取最大可用带宽的内容。如果启用了Throttle,服务器将根据Frame TimeStamp值发送内容(即在必须显示Frame之前发送Frame)。在Throttle情况下,服务器应该在“文件持续时间”内流式传输内容。我已经写了一个sepearte代码的案例工作正常的油门。对于上面的代码,我假设超时永远不会发生,因为我们已经在函数中有数据。 – user1409528 2012-07-06 06:50:19

回答

1

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

+0

增加OS缓冲区会有帮助吗? – user1409528 2012-07-06 06:40:45

+0

@ user1409528这将意味着你可以把你的数据到内核缓冲区快,也不会增加网络上的传输速度。 – nos 2012-07-06 06:42:43

+0

@ user1409528:您看到多少改进取决于客户端和服务器的TCP配置。如果将它们配置为放大窗口大小,并且如果TCP窗口大小按比例放大以处理1分钟的音频,那么这将解释您的速度提高25%-30%。 – jxh 2012-07-06 06:48:41

0

由于TCP输出和输入缓冲器是propably比音频文件小得多,读取接收应用程序的速度可以减慢发送速度。

当两个发送方的TCP输出缓冲器和接收器的输入缓冲器都满,发送方的TCP栈不能够从发送器接收的任何数据。所以发送将被阻止,直到有空间。

如果接收器读取TCP流的速度与播放时需要的数据速度相同。然后转移需要大约200秒。或少一点。

这可以通过在接收端使用应用层缓冲来避免。

0

的问题可能是,如果客户端使用阻止TCP,加上在处理上没有一个单独的线程中的所有数据没有缓冲/排队等权利对文件的“玩家”,那么你的身边是非阻塞只会加快速度,直到达到TCP/IP协议堆栈缓冲区,NIC缓冲区等已满的地步。然后,您最终仍然只能以客户端消费的速度发送数据。记住TCP是一个可靠的点对点协议。

来自哪里在您的测试客户端代码?这是某人某人写过的简单测试客户端吗?