我正在尝试使用C#中的TcpClient和TcpListener创建一个TCP“代理”或“ PortForwarder”。在MSDN上的示例和Bruno Garcia的“ C#中的简单TCP转发器”示例(但是我想改用TcpClient / Listener!)之后,我能够使用基本的Listener + Client +转发器。我计划在将来使它异步。我遇到的问题是,似乎通过侦听器进行的任何新连接都不会“连接”或被拒绝。
我已经尝试使其异步,以避免套接字的“阻塞”。似乎没有什么区别。我确保端口是打开的,并且有一个接收插座,我将其称为“连接”。
public void StartProxy()
{
TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1709);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
TcpClient forwarder = new TcpClient();
client.NoDelay = true;
forwarder.NoDelay = true;
forwarder.Connect(IPAddress.Parse("*Server IP*"), 1992);
while (true)
{
DataExchange(client, forwarder);
DataExchange(forwarder, client);
}
}
public void DataExchange(TcpClient client, TcpClient forwarder)
{
int bytesRead = 0;
byte[] buffer = new byte[8192];
bytesRead = client.GetStream().Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
forwarder.GetStream().Write(buffer, 0, bytesRead);
}
}
我使用的第一个测试是使用PSTools并ping“ 127.0.0.1:1709”。它会ping通并在前32个ping中获得良好的结果-然后关闭或拒绝。编辑:当它关闭/停止接受更多ping时,该应用程序的CPU使用率从几乎0%飙升至12%,并保持不变。
第二个测试实际上是通过它转发我的《魔兽世界》流量。当第一个套接字/连接打开时,它将转发并接收结果。一旦第二个连接打开,它就永远不会到达目的地。例如,第一个连接是游戏登录,第二个连接是服务器选择。我将在游戏登录时获得“成功”提示,但以后不会继续。
我是这方面的新手,我非常感谢您帮助我度过这一难关!