を遮断する私が持っているしたいと思います:がPASVの靴下をノンブロッキングと私のTCPサーバーで接続(アクティブ)ソケット
)は(受け入れ、非ブロッキング持っているパッシブソケットを非ブロック。
接続を受け付けた後クライアントが提供しているIDとパスワードのような認証をしたいと思います。だから私はよく定義されたプロトコルを持っていると私は接続ソケットを介してTCPサーバーとクライアント間のrecv()/ send()の話をブロックしたいと思います。
クライアントIDの確認後、非スレッド接続ソケットを使用して、外部スレッドからサーバーをシャットダウンできるようにしたいと考えています。
問題は、最初に非ブロッキングパッシブソケットを設定すると、受け入れられた接続ソケットも非ブロッキングですか?彼らはなぜソケットを分離しないのですか?
fcntl(ps_fd, F_SETFL, O_NONBLOCK);
Iは、接続ソケットを介して認証を行います:
if((n_recv = recv(sock_fd, buf, sizeof(buf) - 1, 0)) <= 0) { ... }
しかし、ここでrecv()
がブロックしていないと、クライアントが配信できない
私はこのコードを使用して非ブロックモードにパッシブソケットを設定していますそれはEAGAIN
エラーの前の時間の認証IDとパスワードです。
接続ソケットを再びブロッキングモードに戻し、パッシブソケットが非ブロッキングのままにすることはできますか?
これは非常に間違って聞こえます...単一のクライアントでサービス全体をブロックしないでください!代わりに、いくつかのコンテキストと状態マシンを使用してください。 'O_NONBLOCK'の代わりに' select() '(または' epoll() 'のようなプラットフォーム特有のもの)を提案してください –
ええ、彼らは受動的なソケットから状態を継承しているようで、ブロックしません:( –
それで、あなたが止めているのは何ですか? – EJP