c# 套接字编程错误

c# Sockets Programming Errors

你好,我正在尝试创建连接两台电脑的连接。在本地代码中,下面的代码没有任何问题,但是当我们在不同的 pc 上启动客户端代码时,我们无法连接。代码如下。哪里错了?

客户端:

void Start()
{
    Debug.Log(string.Format("Starting TCP and UDP clients on port {0}...", 90));
    udpThread = new Thread(new ThreadStart(ClientThread));
    udpThread.Start();

}

void ClientThread()
    {
        try
        {

            // Establish the remote endpoint  
            // for the socket. This example  
            // uses port 11111 on the local  
            // computer. 
            IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());

            string strHostName = "";
            strHostName = System.Net.Dns.GetHostName();

            IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);

            IPAddress addr = ipEntry.AddressList[0];
            IPAddress addr2 = ipEntry.AddressList[1];



            IPEndPoint localEndPoint = new IPEndPoint(addr, 90);

            // Creation TCP/IP Socket using  
            // Socket Class Costructor 
            Socket sender = new Socket(addr.AddressFamily,
                       SocketType.Stream, ProtocolType.Tcp);

            try
            {
                sender.Connect(localEndPoint);


                Console.WriteLine("Socket connected to -> {0} ",
                              sender.RemoteEndPoint.ToString());

                byte[] messageSent = Encoding.ASCII.GetBytes("Test Client<EOF>");
                int byteSent = sender.Send(messageSent);

                byte[] messageReceived = new byte[1024];

                int byteRecv = sender.Receive(messageReceived);
                Console.WriteLine("Message from Server -> {0}",
                      Encoding.ASCII.GetString(messageReceived,
                                                 0, byteRecv));

                sender.Shutdown(SocketShutdown.Both);
                sender.Close();
            }

            catch (ArgumentNullException ane)
            {

                Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
            }

            catch (SocketException se)
            {

                Console.WriteLine("SocketException : {0}", se.ToString());
            }

            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
            }
        }

        catch (Exception e)
        {

            Console.WriteLine(e.ToString());
        }

    }

和服务器端

    private void Form1_Load(object sender, EventArgs e)
    {
        Console.WriteLine(string.Format("Starting TCP and UDP servers on port {0}...", port));

        devices_battery_midlow_pic_1.Visible = false;
        devices_battery_low_pic_1.Visible = false;
        devices_battery_midhigh_pic_1.Visible = false;
        devices_battery_high_pic_1.Visible = false;

        play_button.Anchor = (AnchorStyles.Bottom);

        Console.WriteLine(DateTime.Now.ToString() + " Getting IP...");
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        connection_id_label.Text = "This IP:\n" + ipAddress.MapToIPv4().ToString();

        Console.WriteLine(DateTime.Now.ToString() + " Starting Connection Thread...");

        connectionThread = new Thread(new ThreadStart(StartServer));
        connectionThread.IsBackground = true;
        connectionThread.Start();


    }
    private void StartServer()
    {
        string strHostName = "";
        strHostName = System.Net.Dns.GetHostName();

        IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);

        IPAddress addr = ipEntry.AddressList[0];

        Console.WriteLine(addr.MapToIPv4().ToString() + "  Starting Connection Thread...");

        IPEndPoint localEndPoint = new IPEndPoint(addr, 90);

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

        try
        {
            listener.Bind(localEndPoint);

            listener.Listen(10);

            while (true)
            {

                Console.WriteLine("Waiting connection ... ");

                Socket clientSocket = listener.Accept();

                // Data buffer 
                byte[] bytes = new Byte[1024];
                string data = null;


                Console.WriteLine("Text received -> {0} ", data);
                byte[] message = Encoding.ASCII.GetBytes("Test Server");

                clientSocket.Send(message);

                clientSocket.Shutdown(SocketShutdown.Both);
                clientSocket.Close();
            }
        }

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

那是在一台电脑上工作,但如果我们将我们的服务器代码移到另一台电脑上,我们将无法接受任何响应。哪里出错了??

客户端代码明确连接到同一台计算机上的服务器。而不是调用 Dns.GetHostName(),您应该使用可配置的值,如命令行参数或读取配置文件。