この質問は、Network port open, but no process attached?とnetstat shows a listening port with no pid but lsof does notに似ています。しかし、彼らの答えは私のものを解決することはできません。プログラムが接続されていない接続が常に5つあるのはなぜですか?
が、私はポート8588.
[[email protected] lcms]# netstat -lnp | grep 8588
tcp 0 0 0.0.0.0:8588 0.0.0.0:* LISTEN 6971/lps
あなたが見ることができるようにTCP接続を待ちlps
と呼ばれるサーバーアプリケーションを持って、何もリスニングソケットと間違っありませんが、私は(いくつかの千テストクライアントを接続したときに書かれました2000年、3000年、4000年のいずれにせよ)、サーバーにログイン要求を接続して送信しても、応答を受け取ることのできないクライアントが5つ(ランダムでもあります)あります。 3000クライアントを例に取る。
[[email protected] lcms]# lsof -i:8588 | grep ES | wc -l
2995
5つの接続はここにいる:
[[email protected] lcms]# netstat -nap | grep 8588 | grep -v 'lps'
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52658 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52692 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52719 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52721 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52705 ESTABLISHED -
上記5は、それらが接続されていることを示して
[[email protected] lcms]# netstat -nap | grep 8588 | grep ES | wc -l
3000
そして、これがlsof
コマンド出力です:これはnetstat
コマンドは与えるものですポート8588のサーバーに接続しますが、プログラムは接続されていません。 2番目の列(RECV-Q
)は、クライアントが要求を送信するにつれて増加し続けます。
上記のリンクでは、NFSマウントとRPCについて説明しています。 RPCのためとして、私はコマンドrcpinfo -p
を使用し、その結果は、nfssta
出力がError: No Client Stats (/proc/net/rpc/nfs: No such file or directory).
質問言いポート8588.そして、NFSマウントとは何の関係もありません:どのようにこれが起こることができますか?常に5人で、同じ5人のクライアントではない。他のクライアントも同じサーバーのIPとポートに接続されており、すべてがサーバーによって適切に処理されるため、ポートの競合とは思われません。
注:クライアントのリクエストを受け入れるには、epoll
のLinuxを使用しています。私は私のプログラムにデバッグコードを書いて、accept
が戻っても5つの接続を見つけることができないすべてのソケット(クライアントの情報と共に)を記録します。これはuname -a
出力されます:あなたの親切な助けを
Linux centos63 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
ありがとう!私は本当に混乱しています。
更新 2013年6月8日: のCentOS 6.4にシステムをアップグレードした後、同様の問題が発生します。最後に私はepoll
に戻って、this pageが、ノンブロッキングであることを聴くfdがあり、EAGAIN
またはEWOULDBLOCK
までのエラーが返されると言ったことがわかりました。そして、はい、それは動作します。これ以上の接続は保留中ではありません。しかし、それはなぜですか? UNIXネットワークプログラミング第1巻は、プロセスがスリープ状態に置かれている理由は、キュー内の一部完了した接続がまだあるので、場合
accept is called by a TCP server to return the next completed connection from the
front of the completed connection queue. If the completed connection queue is empty,
the process is put to sleep (assuming the default of a blocking socket).
を言いますか?
更新 2013年7月1日: リスニングソケットを追加するとき、私はEPOLLET
を使用するので、EAGAIN
に遭遇まで受け付け維持されていない場合、私はすべて受け入れることができません。私はちょうどこの問題を認識しました。私のせい。覚えておいてください:EPOLLET
を使用している場合は、常にread
またはaccept
からEAGAIN
が出てくることを覚えておいてください。テストプログラムで私を証明してくれてありがとうMatthewにもう一度感謝します。
ご使用の環境でIP 192.168.0.241について特別なことはありますか? – Nils
もう1つは@Nilsに追加されましたが、私はそれがIP 192.168.0.241の問題だとは思いません。我々はいくつかのテスト仮想マシンを持っており、それらは5つのホストから来ることができます。 – leowang
ちょっと待ってください。このサーバーはあなたが書いているプログラムを 'lps'していますか? –