我正在开发一个简单的程序,用于在我公司控制的客户端站点上的远程计算机上执行一些带宽测试。该程序的一个副本在远程计算机上运行,并被告知在指定端口上侦听。然后告知同一程序的另一个副本连接到监听计算机,然后发送一个序列化对象,其中包含已知长度的消息,随机内容。转移是定时的,结果发送回原始机器。
它在loopback接口上运行良好;程序的两个副本,一个监听一个部分,另一个连接到同一个端口(以共享方式)并发送数据。但是,当我将此测试的“远程”端移动到同一Intranet上的另一台测试机器时,即使程序说它正在“监听”其连接,该端口也无法通过我的开发机器上的程序连接。我收到标准错误“无法建立连接,因为目标计算机主动拒绝它”。
这两台计算机之间没有活动的防火墙,包括Windows防火墙。我可以创建其他类型的远程连接,例如VNC。
以下是相关的代码段:
倾听连接:
public void BeginListeningAsServer()
{
if (Listener != null) Listener.Stop();
if (ListenerThread != null) ListenerThread.Join();
Listener = new TcpListener(RemoteAddress, RemotePort);
Listener.Start();
Listening = true;
ListenerThread = new Thread(ListenForConnections);
ListenerThread.Start();
}
private void ListenForConnections()
{
while (Listening)
{
if (Listener.Pending())
Listener.BeginAcceptTcpClient(HandleIncomingClient, null);
}
}
private void HandleIncomingClient(IAsyncResult ar)
{
var client = Listener.EndAcceptTcpClient(ar);
var thread = new Thread(c => HandleIncomingClientMessage((TcpClient)c));
HandlerThreads.Add(thread);
Clients.Add(client);
thread.Start(client);
}
连接到此收听程序:
public void ConnectAsClient()
{
var client = new TcpClient();
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Connect(RemoteAddress, RemotePort); //this line fails
Clients.Add(client);
}
答案 0 :(得分:2)
你为听众担任主角的方式有点过时了。您无需指定地址,只需指定端口。