2017-06-18 3 views
0

私はソケットプログラミングの新人です。私は、クライアント - サーバー通信プログラムを開発しており、クライアントがサーバーに接続したときにIPアドレスの代わりにクライアント名を表示するのが難しいです。誰も私に良いアプローチを提案することはできますか?私はそれをどのようにすることができますか?さらなる通信のためには、そのIPも必要です。 は、ここに私のクライアント側のコードです:C#ソケットプログラミング:IPではなくクライアントを名前で識別する方法

mTcpClient = new TcpClient(); 
mTcpClient.BeginConnect(ipa, nPort, onCompleteConnect, mTcpClient); 

そしてそれonCompleteConnect機能:

void onCompleteConnect(IAsyncResult iar) 
    { 

     TcpClient tcpc; 

     try 
     { 
      tcpc = (TcpClient)iar.AsyncState; 
      tcpc.EndConnect(iar); 
      mRx = new byte[512]; 
      tcpc.GetStream().BeginRead(mRx, 0, mRx.Length, onCompleteReadFromServerStream, tcpc); 

     } 
     catch (Exception exc) 
     { 
      MessageBox.Show(exc.Message); 
     } 
    } 

を今、私はだけでなく、クライアント名を送信し、サーバー側で受信したいです。私は何をすべきか?

+0

。簡単なトリックは、カスタムクラスをTcpClientを継承し、ClientNameというプロパティを追加することです。または(msdnサンプルのように)状態オブジェクトを作成し、その状態オブジェクトのプロパティとしてクライアント名を入れます。 – jdweng

答えて

1

StreamWriterStreamReaderを使用して文字列を読み取ります。

クライアント:

StreamWriter sW = new StreamWriter(mTcpClient.GetStream()); 
sW.AutoFlush = true; 

// Send the username 
sW.WriteLine(Environment.UserName); 

サーバー:あなたはconnect文の文字列を使用し接続したときにすでに名前を持っているので

StreamReader sR = new StreamReader(mTcpClient.GetStream()); 

// Read the username (waiting for the client to use WriteLine()) 
String username = sR.ReadLine(); 
+0

ありがとう、魅力的なように働いた。 –

2

クライアントからサーバーにEnvironment.UserNameプロパティを送信します。

+0

ありがとう、しかし私はプログラムの設定でユーザー名を持っています。サーバーに接続すると、そのユーザー名をサーバーに送信します。 サーバー上のこの行は私のクライアント 新しいCLIENTNODEのIP与えます(tclient、新しいバイト[512]、新しいバイト[512]、tclient.Client.RemoteEndPoint.ToString()))); –

+0

そのバイトバッファを使用して、最初の4バイトを "user"というヘッダとユーザ名を送信する次の508バイトのヘッダとして埋め込むことができます。ユーザー名は508バイトである可能性が最も高いので、バッファに末尾のnullバイトを追加してクライアントから送信する必要があります。サーバーは最初の4バイトのヘッダーバイトを読み取ってから、次の508バイトをユーザー名として読み取る必要があります。サーバーは、バッファに追加された末尾のnullバイトを削除してから、ユーザー名を取得する必要があります。 – Ben

関連する問題