首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器的NonBlocking TCP套接字需要时间流内容

服务器的NonBlocking TCP套接字需要时间流内容
EN

Stack Overflow用户
提问于 2012-07-06 06:21:03
回答 3查看 688关注 0票数 0

Problem -我正在运行一个流服务器&使用以下方法创建了一个非阻塞套接字:

代码语言:javascript
复制
flag=fcntl(m_fd,F_GETFL);
flag|=O_NONBLOCK;
fcntl(m_fd,F_SETFL,flag);

然后,服务器使用代码发送媒体文件内容:

代码语言:javascript
复制
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可用带宽(Throttle off)将其以2-3秒的速度传输,但问题是服务器需要199~200秒才能传输完整的内容。调试时,我注释了

m_pSock->send()

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

质疑--如果我使用的是NonBlocking TCP套接字,为什么send()要花费这么多时间?

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

这方面的任何投入都将是helpul。客户行为不在我们的范围之内。

EN

回答 3

Stack Overflow用户

发布于 2012-07-06 06:31:44

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-06 06:40:49

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

当发送方的TCP输出缓冲区和接收方的输入缓冲区都已满时,发送方的TCP堆栈无法从发送方接收任何数据。所以发送将被阻止,直到有空间。

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-07-06 06:44:21

问题可能是,如果客户端使用阻塞TCP,plus正在处理单个线程上没有缓冲区/队列等的所有数据,直到文件的“播放器”,那么非阻塞只会加快速度,直到到达TCP/IP协议栈缓冲区、NIC缓冲区等已满的点。然后,您最终仍然只能在客户端使用数据时才能发送数据。请记住,TCP是一个可靠的点对点协议.

您的客户端代码从何而来?是某个人写的简单的测试客户端吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11356860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档