問題 - ストリーミング サーバーで作業していて、次を使用してノンブロッキング ソケットを作成しました。
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 ~ 3 秒でストリーミングすることを期待していますが、問題は、サーバーがストリーミングに199 ~ 200 秒かかっていることです。完全な内容。デバッグ中にコメントしました
m_pSock->send()
セクション & ファイルをローカルにダンプしようとしました。ファイルのダンプには1 ~ 2 秒かかります。
質問 - NonBlocking TCP ソケットを使用している場合、send()に時間がかかるのはなぜですか?
- データは常に利用可能であるため、select()はすぐに戻ります (ファイルのダンプ中に見たように)。send()はクライアント側のrecv()の影響を受けるということですか?
これに関する情報は役に立ちます。クライアントの行動は私たちの範囲外です。