Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2014, 18:53   #1
SailarmoonKS
Пользователь
 
Регистрация: 01.10.2014
Сообщений: 11
По умолчанию Клиент-сервер по протоколу IPX

Здравствуйте.
Помогите плиз разобраться с такой программой.
Необходимо написать 2 программы: клиент и сервер
Клиент передаёт сообщение серверу по протоколу IPX.

1. Не могу послать сообщение по конкретному mac адресу, получается только если я посылаю широковещательное сообщение
2. Не могу получить на сервере mac адрес машины, которая отправила сообщение.

Создаётся класс IPXEndPoint порожденный от абстрактного EndPoint.

Класс IPXEndPoint:
Код:


public class IpxEndPoint : System.Net.EndPoint
    {
        private const int IpxSocketSize = 14;
        public long m_NodeNumber;
        public short m_SocketNumber;
        public int m_NetworkNumber;
        public IpxEndPoint(int networkNumber, long nodeNumber, short socketNumber)
        {           
            m_NodeNumber = nodeNumber;
            m_NetworkNumber = networkNumber;
            m_SocketNumber = socketNumber;
        }
        public override AddressFamily AddressFamily
        {
            get
            {
                return System.Net.Sockets.AddressFamily.Ipx;
            }
        }
        public override SocketAddress Serialize()
        {
            SocketAddress addr = new SocketAddress(this.AddressFamily, IpxEndPoint.IpxSocketSize);
            
            byte[] NetworkNumber = System.BitConverter.GetBytes(m_NetworkNumber);
            addr[2] = NetworkNumber[0];
            addr[3] = NetworkNumber[1];
            addr[4] = NetworkNumber[2];
            addr[5] = NetworkNumber[3];            
            byte[] NodeNumber = System.BitConverter.GetBytes(m_NodeNumber);
            addr[6] = NodeNumber[0];
            addr[7] = NodeNumber[1];
            addr[8] = NodeNumber[2];
            addr[9] = NodeNumber[3];
            addr[10] = NodeNumber[4];
            addr[11] = NodeNumber[5];            
            byte[] SocketNumber = System.BitConverter.GetBytes(m_SocketNumber);
            addr[12] = SocketNumber[0];
            addr[13] = SocketNumber[1];
            return addr;
        }
        public override EndPoint Create(SocketAddress socketAddress)
        {            
            int netNum = 0; 
            long nodeNum = 0;  
            short sockNum = 0;  
            return new IpxEndPoint(netNum, nodeNum, sockNum);
        }
    }
Клиент:
Код:
static void Main(string[] args)
        {
            string Message = "Hello World!";
            Socket SendSocket;
            IpxEndPoint SendEndPoint;            
            bool done = false; 
            do
            {
                string mac = "";
                Console.WriteLine("Введите mac адрес:");
                mac = Console.ReadLine(); 
                SendSocket = new Socket(AddressFamily.Ipx, SocketType.Dgram, ProtocolType.Ipx);                
                SendSocket.EnableBroadcast = true;
                
                //по маку на сокет 1500 передается сообщение
                //если указать ffffffffffff(12раз), то получится на все узлы
                //если указать конкретный mac адрес, то сервер ничего не получает.
                SendEndPoint = new IpxEndPoint(0, Convert.ToInt64(mac, 16), 1500);                
                SendSocket.Bind(SendEndPoint);                
                SendSocket.SendTo(Encoding.UTF8.GetBytes(Message), SendEndPoint);
                Console.WriteLine("Сообщение отправлено!");
                SendSocket.Close();
            } while (Console.ReadLine() != "exit");
        }
Сервер:
Код:

static void Main(string[] args)
        {            
            Socket ReciveSocket;            
            EndPoint RecieveEndPoint;
            bool done = false;            
            ReciveSocket = new Socket(AddressFamily.Ipx, SocketType.Dgram, ProtocolType.Ipx);            
            ReciveSocket.EnableBroadcast = true;            
            //получать со всех узлов сети по сокету 1500
            RecieveEndPoint = new IpxEndPoint(0,0xffffffffffff, 1500);            
            ReciveSocket.Bind(RecieveEndPoint);
            while (!done)
            {
                Console.WriteLine("Ожидаем сообщения...");                
                byte[] message2 = new byte[256];                
                ReciveSocket.ReceiveFrom(message2, ref RecieveEndPoint);     
                //из полученной IPXEndPoint пытаюсь узнать mac адрес, а там нули одни
                Console.WriteLine("{0},{1}",((IpxEndPoint)RecieveEndPoint).m_SocketNumber.ToString(), ((IpxEndPoint)RecieveEndPoint).m_NodeNumber.ToString()); 
                Console.WriteLine("Получено сообщение от {0} =  :\n {1}",
                    RecieveEndPoint.Serialize().ToString(), //host.HostName,
                    Encoding.UTF8.GetString(message2, 0, message2.Length));
            }
        }
SailarmoonKS вне форума Ответить с цитированием
Старый 07.11.2014, 18:55   #2
SailarmoonKS
Пользователь
 
Регистрация: 01.10.2014
Сообщений: 11
По умолчанию

Класс IPXEndPoint взял с сайта:
https://social.msdn.microsoft.com/Fo...um=netfxnetcom
SailarmoonKS вне форума Ответить с цитированием
Старый 07.11.2014, 22:08   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что значит "не могу"? В чем именно проблема?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.11.2014, 11:22   #4
SailarmoonKS
Пользователь
 
Регистрация: 01.10.2014
Сообщений: 11
По умолчанию

Сообщение отправляется, но не принимается
SailarmoonKS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57