2016-10-08 6 views
0

C#で単純な "リバースシェル"を作成しました。クライアントには最大5人のクライアントがサーバーに接続することができます クライアントはコマンドを入力する必要があります。お互いに通信している場合、たとえばクライアント3がクライアント1にメッセージを送信すると、クライアント1がEnterを押すとこのメッセージが表示されます。C#ソケット特定のデータがいつ送信されるかを知る方法

これは、私がデータを受け取ると、それを表示するために使用したコードです:

while (true) 
{ 
    Console.Write("> "); 
    string cmd = Console.ReadLine(); 
    byte[] buffer = Encoding.UTF8.GetBytes(cmd); 

    client.Send(buffer, 0, buffer.Length, 0); 

    byte[] recievedBuffer = new byte[1024]; 
    int rec = client.Receive(recievedBuffer); 
    byte[] data = new byte[rec];  
    Array.Copy(recievedBuffer, data, rec); 

    Console.WriteLine(Encoding.UTF8.GetString(data)); 

} 

答えて

0

あなたのループではまずデータを送信しなければならないので、問題が起こっていると思います。押す

while (true) 
{ 
    //must send data 
    client.Send(buffer, 0, buffer.Length, 0); 

    //then receive 
    int rec = client.Receive(recievedBuffer); 
} 

は、あなたのプログラムに応じて、実際にデータを送信CLIENT1を入力して、彼は最終的にmessgaeのクライアント3が彼を送っ取得するために自由です。

この実装のため、最初にデータを送信してから受信する必要がありますが、これは非常に限定された動作です。

メッセージの到着時にクライアントにメッセージを取得させる場合は、メッセージが到着したときに別のスレッドを使用してチェックする必要があります。タイマーのようなものが役に立ちます。

マルチスレッド環境で作業することに決めた場合は、スレッド間の競合状態を防ぐために、適切な同期をとってください。

別のオプションは、Asynchronous Client Socketアイデアに基づいて非同期で実装する方法です。

+0

ありがとう、私はそれを試してみます。 –

0

私はあなたがソケットを使用していると仮定します。

コマンドを聞くための別個のスレッド(System.Threading.Thread)と、入力を得るための別のスレッドを作成する必要があります。また、ユーザーに入力を求めている間は、何も印刷しないようにする必要があります。

また、一部のコマンドだけでなく、コマンド全体を受け取っていることを確認する必要があります。

関連する問題