none
TCPサーバでPending中に相手先情報を読み取り、Acceptするかしないかを決定したい RRS feed

  • 質問

  • TCPサーバでPending中に相手先情報を読み取り、Acceptするかしないかを決定したい

    C#と.NetFramework4.0での話です

    TcpListenerでリスン中に接続してきた相手を受け入れるか、受け入れないかを決定する際に、
    AcceptしてからCloseするのではなく、
    Pending中に読み取って、Acceptするか、Accept拒否をしたいです

    今は
    TcpListener tcpL = new TcpListener();

    if(tcpL.Peinding() == true){
        tcpC = (TcpClient)tcpL.AcceptTcpClient();
        if(クライアントが期待したIPアドレスでなければ){
            tcpC.Close();
        }
    }

    としていますが、

    -----------------------------------------
    TcpListener tcpL = new TcpListener();

    if(tcpL.Peinding() == true){
        if(クライアントが期待したIPアドレス){
            tcpC = (TcpClient)tcpL.AcceptTcpClient();
        }else{
            Accept拒否
        }
    }



    というように修正したいです
    ただ、Acceptしないと、相手の情報の読み取りかたがわからず、
    また、Acceptを拒否するというメソッドもないようなのですが、一旦Acceptしないと、相手の情報はわからないのでしょうか
    2012年2月9日 4:40

回答

  • .NET Framework内で行うのは難易度が高そうです。TcpListener / TcpClientはSocketクラスのラッパーです。このSocketクラスがWindows APIのWinSockを呼び出しています。WinSockはUNIXのソケットを参考にしていて、accept()関数なんかも引数がだいたい一緒になっています。で、UNIXのソケットも接続前に接続先を得るのはできなかったりします。
    # 今はできるのかな…?

    しかしWinSockにはUNIXのソケットよりも機能を拡張したAPIが用意されていて、WSAAccept()関数を使うと今回の質問のようなaccept()前に相手先情報を取得できます。

    ただ残念なことにこれはあくまでWinSockの話で、SocketクラスにこのAPIが用意されていません。ですので、どうしても実現したい場合は、DllImportを用いてWSAAccept()関数を呼び出すことになります。問題はWSAAccept()で得られるSOCKETハンドル、これをSocketクラスやTcpClientクラスに変換できない気がします。

    • 回答の候補に設定 佐祐理 2012年2月14日 8:09
    • 回答としてマーク 山本春海 2012年2月23日 6:41
    2012年2月9日 7:24

すべての返信

  • .NET Framework内で行うのは難易度が高そうです。TcpListener / TcpClientはSocketクラスのラッパーです。このSocketクラスがWindows APIのWinSockを呼び出しています。WinSockはUNIXのソケットを参考にしていて、accept()関数なんかも引数がだいたい一緒になっています。で、UNIXのソケットも接続前に接続先を得るのはできなかったりします。
    # 今はできるのかな…?

    しかしWinSockにはUNIXのソケットよりも機能を拡張したAPIが用意されていて、WSAAccept()関数を使うと今回の質問のようなaccept()前に相手先情報を取得できます。

    ただ残念なことにこれはあくまでWinSockの話で、SocketクラスにこのAPIが用意されていません。ですので、どうしても実現したい場合は、DllImportを用いてWSAAccept()関数を呼び出すことになります。問題はWSAAccept()で得られるSOCKETハンドル、これをSocketクラスやTcpClientクラスに変換できない気がします。

    • 回答の候補に設定 佐祐理 2012年2月14日 8:09
    • 回答としてマーク 山本春海 2012年2月23日 6:41
    2012年2月9日 7:24
  • ありがとうございます。

    無理そうですね・・・。
    出来そうにないことがわかったので、良かったです

    2012年2月13日 4:53