私はC#でTCPサーバーを作成していますが、奇妙で潜在的にセキュリティ上の問題も発生しています。TelnetブロッキングC#TCPサーバー
- A C#のソケットは、着信接続を受け入れるように
AcceptAsync
方法を使用して、ポートで待機:次のように新しい接続を受け入れるための私の基本的なアーチがあります。
- 受け入れを終了するために
ThreadPool
を使用して受け入れられた接続をスピンオフします。
すべてがうまく動作しますが、誰かがポートに接続しているとすべてが停止します。
症状:
私は自分のサーバーにtelnetし、サーバが接続を受け入れる終えることは決してありません(すなわち、任意のキーをヒットしていない)任意のデータを送信しない場合。
私の
SocketAsyncEventArgs.Completed
コールバックは決してテルネット接続でヒットしません。さらに悪いことに、それ以降のすべての接続はブロックされ、キューに入れられ、自分のコードで決して受け入れられません。何かアドバイスをいただければ幸いです
TCP 127.0.0.1:8221 chance:53960 CLOSE_WAIT
TCP 127.0.0.1:8221 chance:53962 CLOSE_WAIT
TCP 127.0.0.1:8221 chance:53964 CLOSE_WAIT
:彼らはCLOSE_WAIT
状態に置かれています。
StartAccept:
private void StartAccept(SocketAsyncEventArgs AcceptArgs)
{
CurrentAcceptArgs = AcceptArgs;
AcceptArgs.AcceptSocket = null;
if (AcceptArgs.Buffer == null ||
AcceptArgs.Buffer.Length < 1024)
{
AcceptArgs.SetBuffer(new byte[1024], 0, 1024);
}
if (MainSocket != null)
{
lock (MainSocket)
{
// If this is false, we have an accept waiting right now, otherwise it will complete aynsc
if (MainSocket.AcceptAsync(AcceptArgs) == false)
{
ThreadPool.QueueUserWorkItem(FinishAccept, AcceptArgs);
StartAccept(GetConnection());
}
}
}
}
が接続を受け入れるためのコールバックを完了:
protected override void OnIOCompleted(object sender, SocketAsyncEventArgs e)
{
PWClientRemote RemoteClient = e.UserToken as PWClientRemote;
// Determine which type of operation just completed and call the associated handler.
switch (e.LastOperation)
{
case SocketAsyncOperation.Accept:
StartAccept(GetConnection());
ThreadPool.QueueUserWorkItem(FinishAccept, e);
break;
default:
base.OnIOCompleted(sender, e);
break;
}
}
フィニッシュは受け入れ:ここ
private void FinishAccept(object StateObject)
{
SocketAsyncEventArgs args = (SocketAsyncEventArgs)StateObject;
FinishAcceptInternal(args);
}
は、Telnet接続からではなく、データを送信する前にwiresharkのです
No. Time Source Destination Protocol Length Info
1 0.000000 192.168.1.146 192.168.1.109 TCP 66 59766 > 8221 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
2 0.000076 192.168.1.109 192.168.1.146 TCP 66 8221 > 59766 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
3 0.000389 192.168.1.146 192.168.1.109 TCP 60 59766 > 8221 [ACK] Seq=1 Ack=1 Win=65536 Len=0
これは接続を確立するための完全なハンドシェイクである必要がありますが、Completed
イベントは発生しません。
あなたはCLOSE_WAITでグーグル?あなたがした場合、あなたはそれを得た理由を知っています。コードはどこにありますか? – jgauffin
接続試行のタイムアウトを指定できますか? – Fantius
はい、接続が不正なTCP状態になっていることを理解しています。私は解決策を探しています。現在、悪意のあるユーザーが単にtelnetを使用してサーバーに接続することは可能です。 – Stryck