2012-02-01 6 views
3

これは1000回前に尋ねられたかもしれませんが、私のケースに関する特定の情報を見つけることはできません。TCP経由で同じプログラムの他のインスタンスに接続することができない

私はLAN経由でクライアントの他のインスタンスに接続しなければならないC#クライアントプログラムを持っています。あるクライアントを別のクライアントに接続するには、TcpListener/TcpClient aproachを使用します。どちらのインスタンスもリスナーを持ち、互いに接続したり受信したりする新しいクライアントを作成できます(これは、どのインスタンスが接続を開始したかに依存しません)。

リスナーを作成するために、私は次のコードのビットを使用します。

// In the constructor: 
listener = new TcpListener(IPAddress.Any, 32842); 
listenThread = new Thread((ThreadStart)ListenForConnections); 
listenThread.Name = "ListenThread"; 
listenThread.IsBackground = true; 
listenThread.Start(); 

// Listening for connections: 
private void ListenForConnections() 
{ 
    listener.Start(); 
    Console.WriteLine("Started listening for connections"); 
    for (; ;) 
    { 
     if (listener.Pending()) 
     { 
      using (TcpClient client = listener.AcceptTcpClient()) 
      { 
       // My own layer over the TcpClient. 
       AsyncTCPClient other = new AsyncTCPClient(client); 
       Console.WriteLine("Connection from " + client.Client.RemoteEndPoint); 
       other.Received += DataReceived; 
       other.Exception += ExceptionOccurred; 
       connections.Add("Player", other); 
       other.Start(); 
      } 
     } 
     else 
     { 
      Thread.Sleep(5); 
     } 
    } 
} 

作成し、別のクライアントに接続するには、私は次のコードのビットを使用します。

public void Connect(IPEndPoint other) 
{ 
    if (socket == null) 
    { 
     socket = new TcpClient(AddressFamily.InterNetwork); 
     socket.Client.ReceiveBufferSize = 2 * 1024 * 1024; 
    } 
    // Should force-close the socket after 5 seconds if it can't be closed automatically. 
    socket.LingerState = new LingerOption(true, 5); 
    socket.BeginConnect(other.Address, other.Port, ConnectionCallback, other); 
    IsConnecting = true; 
} 

与えConnectionCallback BeginConnectのパラメータとして次のようになります。

private void ConnectionCallback(IAsyncResult result) 
{ 
    IsConnecting = false; 
    IsConnected = socket.Connected; 
    if (IsConnected) 
    { 
     IPEndPoint connectedTo = (IPEndPoint)result.AsyncState; 
     stream = socket.GetStream(); 
     if (Connected != null) 
     { 
      Connected(this, null); 
     } 
    } 
    else 
    { 
     if (Exception != null) 
     { 
      RaiseException(new Exception("Unable to connect to host")); 
     } 
    } 
} 

ただし、毎回私は彼はコールバック、TcpClientは、他のインスタンスに接続するのに失敗し、Exceptionイベントがスローされます。今、私はインターネット(Google)の周りを検索している間に、接続の両側にあるファイアウォールと何か関係があるかもしれないということです。しかし、私はすべてのファイアウォールをオフにしてテストしました。

+0

例外はスローされますか? – TJHeuvel

+0

まあ、RaiseExceptionの例外です。しかし、「接続されたホストが一定時間後に正しく応答しなかったために接続できませんでした。接続されたホストがip:portに応答しなかったため接続に失敗しました」 – ThaMe90

+1

telnetを使用して接続をテストし、コマンドを開きますプロンプトが表示されたら、telnet ipOfRemoteHost 32842 [enter]を押して、リスナーがokで、ネットワークに問題がないかどうかを確認します(これまでにTelnet Windows Featureを追加する必要があるかもしれません)。 – Tomek

答えて

2

コールバックでSocket.EndConnect()が呼び出されません。 これをMSDNでご覧ください: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.endconnect.aspx

+0

EndConnect()を呼び出すと、アプリケーションは「接続されたパーティが一定期間後に正しく応答しなかったか、接続されたホストが応答できなかったため接続に失敗しました」という例外を生成しました。 – ThaMe90

+0

それは私の最後に愚かな間違いだったようだった。これを動作させる以前の試みでは、ローカルのTcpClientを特定のポートにバインドしました。私はそれがシステムによって与えられたポートを使用するように変更しました。しかし、そのポート番号を使ってプログラムの他のインスタンスに接続しようとしました。私はそれを変更した後、接続することに成功しました。しかし、私はEndConnect()に関するあなたの呼び出しがそれと関係があると思いますので、これを答えとしてマークします。 :) – ThaMe90

関連する問題