2017-06-19 1 views
-1

を遮断する私が持っているしたいと思います:がPASVの靴下をノンブロッキングと私のTCPサーバーで接続(アクティブ)ソケット

  1. )は(受け入れ、非ブロッキング持っているパッシブソケットを非ブロック。

  2. 接続を受け付けた後クライアントが提供しているIDとパスワードのような認証をしたいと思います。だから私はよく定義されたプロトコルを持っていると私は接続ソケットを介してTCPサーバーとクライアント間のrecv()/ send()の話をブロックしたいと思います。

  3. クライアントIDの確認後、非スレッド接続ソケットを使用して、外部スレッドからサーバーをシャットダウンできるようにしたいと考えています。

問題は、最初に非ブロッキングパッシブソケットを設定すると、受け入れられた接続ソケットも非ブロッキングですか?彼らはなぜソケットを分離しないのですか?

fcntl(ps_fd, F_SETFL, O_NONBLOCK); 

Iは、接続ソケットを介して認証を行います:

if((n_recv = recv(sock_fd, buf, sizeof(buf) - 1, 0)) <= 0) { ... } 

しかし、ここでrecv()がブロックしていないと、クライアントが配信できない

私はこのコードを使用して非ブロックモードにパッシブソケットを設定していますそれはEAGAINエラーの前の時間の認証IDとパスワードです。

接続ソケットを再びブロッキングモードに戻し、パッシブソケットが非ブロッキングのままにすることはできますか?

+0

これは非常に間違って聞こえます...単一のクライアントでサービス全体をブロックしないでください!代わりに、いくつかのコンテキストと状態マシンを使用してください。 'O_NONBLOCK'の代わりに' select() '(または' epoll() 'のようなプラットフォーム特有のもの)を提案してください –

+0

ええ、彼らは受動的なソケットから状態を継承しているようで、ブロックしません:( –

+1

それで、あなたが止めているのは何ですか? – EJP

答えて

1

Linuxでは、受け入れ可能なソケットによって遮断状態が継承されません。 BSDから派生したシステム(macOSやおそらくWindows(何か指定されたものが見つかりませんでした)でも)では、非ブロックは継承されます。

1つの解決策は、受け入れられたソケットを再びブロックし、認証フェーズが完了したらノンブロッキングすることです。これは、シングルスレッドの場合、残りのプログラムをブロックします。つまり、1人のユーザーの認証中に他の接続を受け入れることはできません。

もう1つの解決策は、接続を処理するためにスレッドまたはプロセスを使用することです。

それともあなたがselectpollのようないくつかのポーリングを使用するかは、Linuxを使っているのであれば受け入れられたソケット上で受信するデータがある場合に知っている(BSDシステム上または対応するバリアント)epollを使用することができます。これはあなたが、私は、このような解決策を試してみました、動作しているようですあなたがWAITING_FOR_USERNAMEWAITING_FOR_PASSWORDLOGGED_INなど

+0

すべてが継承されています。ブロック/非ブロックモード、受信バッファサイズ、... – EJP

+0

@EJPそうです。 。 –

1

のような状態があり、単純なステートマシンを、使用することができます機能するために。

パッシブソケットのaccept()から受け取ったOS X接続ソケットは、ノンブロッキングモードを継承しています。だから受け入れた後、接続ソケットモードをもう一度ブロックするように変更しています。

例コード

fcntl(ps_fd, F_SETFL, O_NONBLOCK); 

    int cs_fd = accept(ps_fd); 
    // revert connection socket to non-blocking 
    int opts = fcntl(cs_fd, F_GETFL); 
    opts = opts & (~O_NONBLOCK); 
    fcntl(cs_fd, F_SETFL, opts); 

    // then authentication via cs_fd 

    // after authentication change it to non-blocking again 
    fcntl(cs_fd, F_SETFL, O_NONBLOCK); 
関連する問題