私は単純なソケットラッパークラスを実装しました。これは、非ブロック機能が含まれています。クラスは、単純な関数受け取る含まノンブロッキングUnixソケットの高速化(C++)
void Socket::set_non_blocking(const bool b) {
mNonBlocking = b; // class member for reference elsewhere
int opts = fcntl(m_sock, F_GETFL);
if(opts < 0) return;
if(b)
opts |= O_NONBLOCK;
else
opts &= ~O_NONBLOCK;
fcntl(m_sock, F_SETFL, opts);
}
:実際には
int Socket::recv(std::string& s) const {
char buffer[MAXRECV + 1];
s = "";
memset(buffer,0,MAXRECV+1);
int status = ::recv(m_sock, buffer, MAXRECV,0);
if(status == -1) {
if(!mNonBlocking)
std::cout << "Socket, error receiving data\n";
return 0;
} else if (status == 0) {
return 0;
} else {
s = buffer;
return status;
}
}
を、〜15msの遅延時にソケット::のrecv(があるように思われます)と呼ばれる。この遅延は避けられますか? select()を使用する非ブロッキングの例をいくつか見てきましたが、どのように役立つか理解できません。
アドバイスありがとうございますが、私の問題は文字通りrecv()への呼び出しが受け入れがたい15ミリ秒の遅延を表示しているソケットを1つしか考えていません。それは1つのソケットをポーリングするだけなので、私は問題を推測するには間違っていますか? – duckworthd
他の要因があるかもしれません、起こっているコードの少量に基づいて伝えることができません。ソケットが1つだけで、データを待っていると仮定します。なぜ非ブロック化を使用しますか?データを待っている間に何か他のことをしているということですか?他の作品が到着するとすぐにデータを受け取ることができますか? – stefanB
@duckworthdあなたはrecv()のまわりであなたのタイマーを正確にスタート/ストップさせますか?また、実際にはエラーチェックを行っていません。 -1はあなたが想定するEAGAIN以外のものかもしれません。期待しているデータを入手していますか? – Duck