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

質問
-
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しないと、相手の情報はわからないのでしょうか
回答
-
.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クラスに変換できない気がします。
すべての返信
-
.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クラスに変換できない気がします。