C#无法连接到本地主机

时间:2019-11-01 21:34:55

标签: c# .net sockets

我正在编写一个非常简单的.NET TCP Server和一个非常简单的TCP Client,它们都应在同一台计算机(Window 10家用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()时,我遇到了这个异常:

  

指定了无效的IP地址。

我尝试使用 127.0.0.1 并得到:

  

无法建立连接。永久拒绝目标计算机127.0.0.1:5002

我尝试过 localhost ,我得到

  

指定了无效的IP地址

再次

。我尝试使用分配给WiFi的IP地址,然后又得到

  

无法建立连接。永久拒绝目标计算机192.168.10.11:5002

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

我在哪里失败了?

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

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

Server code

1 个答案:

答案 0 :(得分:3)

您正在使用带有“ IPEndPoint”参数的构造函数。此构造函数不会自动连接到服务器,并且必须在使用套接字之前调用“ Connect”方法。这就是为什么您会收到错误消息“未连接的套接字上不允许进行操作”的原因。另外,您为客户端提供了错误的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);