Серверное клиентское приложение, работающее на одном хост-компьютере с двумя разными IP-адресами.

Я разрабатываю серверное клиентское приложение. В котором сервер и клиент работают на одном хост-компьютере. У хозяина есть две ники. Сервер работает на IP одного из серверов, а клиент был связан с IP другого сервера. Соответствующие коды сервера и клиента ниже.

Код сервера:

namespace Server {класс Program { static void Main(string[] args) { Console.WriteLine("Сервер запущен и ждет.....");

        // Create Server Socket to recive
        try
        {
        IPAddress ipAddress = IPAddress.Parse("192.0.0.4");
        IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 2700);
        TcpListener Ls = new TcpListener(ipLocalEndPoint);
         Ls.Start();
        while (true)
        {
            Socket soc = Ls.AcceptSocket();
            //soc.SetSocketOption(SocketOptionLevel.Socket,
            //        SocketOptionName.ReceiveTimeout,10000);
            try
            {
                Stream s = new NetworkStream(soc);
                StreamReader sr = new StreamReader(s);
                StreamWriter sw = new StreamWriter(s);
                sw.AutoFlush = true; // enable automatic flushing
                sw.WriteLine("{0} Number of employee",        ConfigurationManager.AppSettings.Count);
                while (true)
                {
                    string name = sr.ReadLine();
                    Console.WriteLine("name {0}",name);
                    sw.WriteLine("entered name {0}", name);
                    if (name == "" || name == null) break;
                    string job = ConfigurationManager.AppSettings[name];
                   if (job == null) job = "No such employee";
                    sw.WriteLine(job);
                }
                s.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            soc.Close();
        }

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

    }
}

}

Код клиента

public class clnt {

public static void Main()
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse("192.0.0.5");
        IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8000);
        TcpClient tcpclnt = new TcpClient(ipLocalEndPoint);
        Console.WriteLine("Connecting.....");
        tcpclnt.Connect("192.0.0.4", 2700);
        // use the ipaddress as in the server program

        Console.WriteLine("Connected");
        Console.Write("Enter the string to be transmitted : ");

        String str = Console.ReadLine();
        Stream stm = tcpclnt.GetStream();

        ASCIIEncoding asen = new ASCIIEncoding();
        byte[] ba = asen.GetBytes(str);
        Console.WriteLine("Transmitting.....");

        stm.Write(ba, 0, ba.Length);

        byte[] bb = new byte[100];
        int k = stm.Read(bb, 0, 100);

        for (int i = 0; i < k; i++)
            Console.Write(Convert.ToChar(bb[i]));

        tcpclnt.Close();
    }

    catch (SocketException e)
    {
        Console.WriteLine("Error..... " + e.ErrorCode);
    }
    while(true)
    {}
}

}

Какой код делает не важно. Только часть подключения является предметом озабоченности.

Когда я использую конструктор "TcpClient" без каких-либо параметров. Я имею в виду заменить следующие три строки клиента IPAddress ipAddress = IPAddress.Parse ("192.0.0.5"); IPEndPoint ipLocalEndPoint = новый IPEndPoint (ipAddress, 8000); TcpClient tcpclnt = новый TcpClient(ipLocalEndPoint); с TcpClient tcpclnt = новый TcpClient(); Работает нормально.

или же

Когда клиент работает на другом компьютере, он также работает нормально.

1 ответ

Для потомков: использование TcpClient()

позволяет базовому поставщику услуг назначать наиболее подходящий локальный IP-адрес и номер порта

(Источник: https://msdn.microsoft.com/en-us/library/zc1d0e0f%28v=vs.110%29.aspx), поэтому он работает.

Назначение конечной точки путем вызова TcpClient(IPEndpoint) перегрузка вынуждает его к определенному NIC, адресу и порту. Если нет сетевого маршрута от этой IPEndpoint к конечной точке сервера, соединение не может быть установлено. Обычно считается плохой практикой иметь два сетевых адаптера на одной машине в одной сети, если не задействована совместная работа; 192.0.0.4 а также 192.0.0.5 проблема, и размещение сетевых карт в отдельных сетях с маршрутом между ними будет работать с или без указания локальной конечной точки на клиенте.

Другие вопросы по тегам