gpt4 book ai didi

C# 无法连接到本地主机

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:33 25 4
gpt4 key购买 nike

我正在编写一个非常简单的 .NET TCP Server 和非常简单的 TCP Client,它们应该在同一台机器(Window 10 Home PC)上运行并连接每个其他(仅用于测试目的)。在服务器中,我以这种方式等待连接:

public static void StartListening()
{
string hostname = Dns.GetHostName();
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Properties.Settings.Default.Port);

Socket listener = new Socket(
ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

try
{
listener.Bind(localEndPoint);
listener.Listen(Properties.Settings.Default.Port);

while (true)
{
allDone.Reset();

Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);

allDone.WaitOne();
}

}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}

Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}

public static void AcceptCallback(IAsyncResult ar)
{
allDone.Set();

Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);

StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);

var frames = Directory.EnumerateFiles(Properties.Settings.Default.FramesPath);

foreach (string filename in frames)
{
Console.Write("Sending frame: {}...", filename);
SendFile(handler, filename);
Thread.Sleep(Properties.Settings.Default.FrameDelay);
}
}

在客户端中,我以这种方式创建连接:

private void startClient(string host, int port)
{
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);

ClientTCP = new TcpClient();

ClientTCP.Connect(serverEndPoint);

Reader = new StreamReader(ClientTCP.GetStream());

Listen = true;

listner = Listener();
}

startClient就是这样调用的。

startClient(txtAddr.Text, (int)int.Parse(txtPort.Text));

当我运行客户端将 host 变量设置为当前机器名称时(与服务器通过 Dns.GetHostName() 检索相同,我得到了这个异常:

An invalid ip address was specified.

我尝试使用 127.0.0.1 并得到:

Connection could not be established. Persistent rejection of the target computer 127.0.0.1:5002

我尝试使用 localhost 并得到了

An invalid ip address was specified

再次。我尝试使用分配给 WiFi 的 IP 地址,我又得到了

Connection could not be established. Persistent rejection of the target computer 192.168.10.11:5002

我确定计算机网络可以正常工作,因为我将它用于许多其他事情,包括连接到本地 TCP 服务,而且我确定客户端和服务器代码都可以正常工作,因为我可以在不同的 PC 上连接它们将 localhost 设置为客户端 host 变量值。为什么我无法在我的代码中使用环回连接?

我哪里失败了?

附言我允许在 Windows 防火墙规则中连接到服务器二进制文件,我也允许客户端二进制文件的传出连接。

对于任何愿意在这里检查服务器代码的人来说,它是:

Server code

最佳答案

您正在使用带有“IPEndPoint”参数的构造函数。此构造函数不会自动连接到服务器,您必须在使用套接字之前调用“连接”方法。这就是为什么您收到错误消息“未连接的套接字不允许操作”的原因。此外,您为客户端提供了错误的 IPEndPoint。
请在客户端上尝试:

private void startClient(string host, int port)
{
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);

ClientTCP = new TcpClient();

ClientTCP.Connect(serverEndPoint);

Reader = new StreamReader(ClientTCP.GetStream());

Listen = true;

listner = Listener();
}

您可能需要一些异常处理,但现在应该可以了。

更新:
ipHostInfo.AddressList 可能有多个地址,而其中一个就是您想要的。它不一定是第一个。我手动指定了它并且它有效:

//string hostname = Dns.GetHostName();
//IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1");
//IPAddress ipAddress = ipHostInfo.AddressList[0];

IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5002);

关于C# 无法连接到本地主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com