これは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)の周りを検索している間に、接続の両側にあるファイアウォールと何か関係があるかもしれないということです。しかし、私はすべてのファイアウォールをオフにしてテストしました。
例外はスローされますか? – TJHeuvel
まあ、RaiseExceptionの例外です。しかし、「接続されたホストが一定時間後に正しく応答しなかったために接続できませんでした。接続されたホストがip:portに応答しなかったため接続に失敗しました」 – ThaMe90
telnetを使用して接続をテストし、コマンドを開きますプロンプトが表示されたら、telnet ipOfRemoteHost 32842 [enter]を押して、リスナーがokで、ネットワークに問題がないかどうかを確認します(これまでにTelnet Windows Featureを追加する必要があるかもしれません)。 – Tomek