Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Форум (UDP)


Автор: Ronin08 16.4.2008, 11:51
Доброго времени суток!
имеется код "форума"
Код

namespace Forum_Console
{
    class Chat
    {
        private static IPAddress remoteIPAddress;
        private static int remotePort;
        private static int localPort;

        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                //Получаем данные, необходимые для соединения
                Console.WriteLine("Enter Local Port");
                localPort = Convert.ToInt16(Console.ReadLine());

                Console.WriteLine("Enter Remote Port");
                remotePort = Convert.ToInt16(Console.ReadLine());

                Console.WriteLine("Enter Remote IP address");
                remoteIPAddress = IPAddress.Parse(Console.ReadLine());

                //Создаем слушающий поток
                Thread tRec = new Thread(new ThreadStart(Receiver));
                tRec.Start();

                while (true)
                {
                    Send(Console.ReadLine());
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        private static void Send (string datagram)
        {
            //Создаем UdpClient
            UdpClient sender = new UdpClient();

            //Создаем IPEndPoint по информации об удаленном хосте
            IPEndPoint endPoint = new IPEndPoint(remoteIPAddress, remotePort);

            try
            {
                //Преобразуем данные в массив байтов
                byte[] bytes = Encoding.ASCII.GetBytes(datagram);

                //Отправляем данные
                sender.Send(bytes, bytes.Length, endPoint);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                //Закрываем соединение
                sender.Close();
            }
        }

        public static void Receiver()
        {
            //Создаем UdpClient для чтения входящих данных
            UdpClient recevingUdpClient = new UdpClient(localPort);

            //IPEndPoint с информацией об удаленном хосте
            IPEndPoint RemoteIpEndPoint = null;

            try
            {
                Console.WriteLine("----***Ready for Chat!!!***----");
                while (true)
                {
                    //Ожидание дейтаграммы
                    byte[] reciveBytes = recevingUdpClient.Receive(ref RemoteIpEndPoint);
                    //Преодразуем и отображаем данные
                    string returndata = Encoding.ASCII.GetString(reciveBytes);
                    Console.WriteLine("-" + returndata.ToString());
                }
            }
            catch (Exception e )
            {
                Console.WriteLine(e.ToString ());
            }
        }
    }
}

Когда 2 участника , то все ок, 
но когда я хочу сделать что-то типа сервер и 2 клиетна (т.е. сервер видет сообщения от всех клиентов и свои сообщения, а клиент тока сообщения свои и сервера"), то возникают проблемы, т.к. у каждого участника есть Приемный порт и Отправляющий порт("Форум" должен работать на одной машине).
Заметьте, что "форум" в кавычках, т.к. это форумом нельзя назвать smile 
Так вот как сделать, чтобы сообщение от сервера видел не 1 клиент, а все.
надо как-то разобраться с отправляющим портом на сервере, чтобы был не один, а несколько(они же и будут приемными портами клиентов) 

Автор: Gelis 16.4.2008, 12:36
В качестве remoteIPAddress нужно взять один из адресов диапазона адресов груповой рассылки

Автор: Gelis 16.4.2008, 16:16
Адреса групповой рассылки находятся в диапазоне 224.0.0.0 - 239.255.255.255
Прочитайте в MSDN про методы UdpClient JoinMulticastGroup и DropMulticastGroup

Автор: Ronin08 16.4.2008, 16:58
так я же написал, что все и клиенты, и сервер работают на одной машине, т.е. remoteIPAddress = 127.0.0.1 (IP-адресс локальной обратной связи)

Автор: it_medved 22.4.2008, 11:06
Создай массив сокетов, и посылай им все сообщения по очереди, кроме того, хто прислал это сообщение. я так делал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)