Получение ip-адреса для сервера - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Пробую разобраться с сервером на c# сидя на mac с xamarin studio. При запуске проги идет попытка запустить сервер, но прога крашится из-за невозможности получения ip(не знаю почему). Хотя на винде все работает. Ругается на это
System.Net.IPAddress ip = System.Net.Dns.GetHostByName(host).AddressList[0];
Как исправить эту проблему? КЛАСС Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace app
{
    class Program
    {
        const int PORT = 90;
        static void Main(string[] args)
        {
            Console.WriteLine("Запустить сервер? Y | N");
            if (Console.ReadLine().Trim().ToUpper() == "Y")
            {
                //получение имени компъютера
                string host = System.Net.Dns.GetHostName();
                //получение ip
                System.Net.IPAddress ip = System.Net.Dns.GetHostByName(host).AddressList[0];
                Console.WriteLine("IP-адрес: " +ip.ToString());
                Server server = new Server(PORT, Console.Out);
                server.Work();
            }
        }
    }
}
КЛАСС Server.cs
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
 
namespace app
{
    class Server
    {
        public TcpListener Listener; // объект принимающий tcp-клиентов
        public List<ClientInfo> clients = new List<ClientInfo>();
        public List<ClientInfo> NewClients = new List<ClientInfo>();
        public static Server server;
        static System.IO.TextWriter Out;
 
        public Server(int Port, System.IO.TextWriter _Out)
        {
            Out = _Out;
            Server.server = this;
 
            //создаем слушателя для указанного порта
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start(); // запускаем его
        }
 
        public void Work()
        {
            Thread clientListener = new Thread(ListenerClients);
            clientListener.Start();
            while (true)
            {
                foreach (ClientInfo client in clients)
                {
                    if (client.IsConnect)
                    {
                        NetworkStream stream = client.Client.GetStream();
                        while (stream.DataAvailable)
                        {
                            int ReadByte = stream.ReadByte();
                            if (ReadByte != -1)
                            {
                                client.buffer.Add((byte)ReadByte);
                            }
 
                        }
                        if (client.buffer.Count > 0)
                        {
                            Out.WriteLine("Resend");
                            foreach (ClientInfo otherClient in clients)
                            {
                                byte[] msg = client.buffer.ToArray();
                                client.buffer.Clear();
                                foreach (ClientInfo _otherClient in clients)
                                {
                                    if (_otherClient != client)
                                    {
                                        try
                                        {
                                            _otherClient.Client.GetStream().Write(msg, 0, msg.Length);
                                        }
                                        catch 
                                        {
                                            _otherClient.IsConnect = false;
                                            _otherClient.Client.Close();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                clients.RemoveAll(delegate (ClientInfo CI)
                {
                    if (!CI.IsConnect)
                    {
                        Server.Out.WriteLine("Клиент отсоеденился");
                        return true;
                    }
                    return false;
                });
                if (NewClients.Count > 0)
                {
                    clients.AddRange(NewClients);
                    NewClients.Clear();
                }
            }
        }
        //остановка сервера
        ~Server()
        {
            //если слушатель был создан
            if (Listener != null)
            {
                //остановим его
                Listener.Stop();
            }
            foreach (ClientInfo client in clients)
            {
                client.Client.Close();
            }
        }
        static void ListenerClients()
        {
            while (true)
            {
                server.NewClients.Add(new ClientInfo(server.Listener.AcceptTcpClient()));
                Out.WriteLine("Новый клиент");
            }
        }
    }
    class ClientInfo
    {
        public TcpClient Client;
        public List<byte> buffer = new List<byte>();
        public bool IsConnect;
        public ClientInfo(TcpClient Client)
        {
            this.Client = Client;
            IsConnect = true;
        }
    }
}
P.S. Прога не моя, отсюда взял https://www.youtube.com/watch?v=-xtGcZkG1V4

Решение задачи: «Получение ip-адреса для сервера»

textual
Листинг программы
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System;
 
namespace Fchat
{
    class Server
    {
        public TcpListener Listener; //объект, принимающий TCP клиентов
        public List<ClientInfo> clients = new List<ClientInfo>();
        public List<ClientInfo> NewClients = new List<ClientInfo>();
        public static Server server;
        static System.IO.TextWriter Out;
 
        public Server(int Port, System.IO.TextWriter _Out)
        {
            Out = _Out;
            Server.server = this;
 
            //создаем слушателя для указанного порта
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start(); //запускаем его
        }
 
        public void Work()
        {
            Thread clientListener = new Thread(ListenerClients);
            clientListener.Start();
 
            while (true)
            {
                foreach (ClientInfo client in clients)
                {
                    if (client.IsConnect)
                    {
                        NetworkStream stream = client.Client.GetStream();
                        while (stream.DataAvailable)
                        {
                            int ReadByte = stream.ReadByte();
                            if (ReadByte != -1)
                            {
                                client.buffer.Add((byte)ReadByte);
                            }
                        }
                        if (client.buffer.Count > 0)
                        {
                            Out.WriteLine("Resend");
                            foreach (ClientInfo otherClient in clients)
                            {
                                byte[] msg = client.buffer.ToArray();
                                client.buffer.Clear();
                                foreach (ClientInfo _otherClient in clients)
                                {
                                    if (_otherClient != client)
                                    {
                                        try
                                        {
                                            _otherClient.Client.GetStream().Write(msg, 0, msg.Length);
                                        }
                                        catch
                                        {
                                            _otherClient.IsConnect = false;
                                            _otherClient.Client.Close();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                clients.RemoveAll(delegate (ClientInfo CI)
                   {
                       if (!CI.IsConnect)
                       {
                           Server.Out.WriteLine("Клиент отсоеденился.");
                           return true;
                       }
                       return false;
                   });
                if (NewClients.Count > 0)
                {
                    clients.AddRange(NewClients);
                    NewClients.Clear();
                }
            }
        }
        //остановка сервера
        ~Server()
        {
            //если слушатель был создан
            if (Listener != null)
            {
                //остановим его
                Listener.Stop();
            }
            foreach (ClientInfo client in clients)
            {
                client.Client.Close();
            }
 
        }
        static void ListenerClients()
        {
            while (true)
            {
                server.NewClients.Add(new ClientInfo(server.Listener.AcceptTcpClient()));
                Out.WriteLine("Новый клиент.");
            }
        }
    }
 
    class ClientInfo
    {
        public TcpClient Client;
        public List<byte> buffer = new List<byte>();
        public bool IsConnect;
        public ClientInfo(TcpClient Client)
        {
            this.Client = Client;
            IsConnect = true;
        }
    }
 
    class Program
    {
        const int PORT = 90;
 
        static void Main(string[] args)
        {
            Console.WriteLine("Запустить сервер? (Y / N)");
            if (Console.ReadLine().Trim().ToUpper() == "Y")
            {
                //получение имени компъютера
                IPHostEntry host = Dns.GetHostEntry("localhost");
                IPAddress ip = host.AddressList[0];
                IPEndPoint ipEndPoint = new IPEndPoint(ip, 11000);
                Socket sListener = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Console.WriteLine("IP адрес " + ip.ToString());
                sListener.Bind(ipEndPoint);
                sListener.Listen(10);
                Server server = new Server(PORT, Console.Out);
                server.Work();
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы