-
Code's Tags
-
Your Codes
-
Reffers
-
Linked Codes
|
Code:
Short link for Twitter:
HTML:
HTML view:
Copy Source | Copy HTML- public static class Server
- {
- // Private members
-
- private static Socket servSock = null;
- private static Thread servThread = null;
-
- private static void ServerFunc()
- {
- // Создаем Ñокет Ð´Ð»Ñ ÑÐ»ÑƒÑˆÐ°Ð½Ð¸Ñ UDP-датаграмм
- servSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- EndPoint endPoint = new IPEndPoint(IPAddress.Any, Common.Port);
- servSock.Bind(endPoint);
- // Обратите внимание, мы не вызваем Listen
-
- while (true)
- {
- byte[] buf = new byte[4];
- byte[] req = Common.DiscoveryRequest;
- // Говорим, что хотим принÑть датаграмму откуда угодно на данный порт
- endPoint = new IPEndPoint(IPAddress.Any, Common.Port);
- servSock.ReceiveFrom(buf, ref endPoint);
- // ПроверÑем, что же нам пришло
- if (buf[ 0] == req[ 0] && buf[1] == req[1] && buf[2] == req[2] && buf[3] == req[3])
- {
- FireServerWasDiscovered(endPoint);
- // Отвечаем клиенту. Тут момент. endPort имеет уже не тот номер порта,
- // на котором мы Ñлушаем и на который поÑылал клиент
- // КÑтати, никто не знает, почему? :)
- (endPoint as IPEndPoint).Port = Common.Port;
- servSock.SendTo(Common.ServerResponse, endPoint);
- }
- }
- }
-
- private static void FireServerWasDiscovered(EndPoint endPoint)
- {
- if (ServerWasDiscovered != null)
- ServerWasDiscovered(endPoint);
- }
-
- // Public members
-
- public delegate void ServerWasDiscoveredNotification(EndPoint endPoint);
- // Ðто Ñобытие поиÑка кем-то данного Ñервера
- public static event ServerWasDiscoveredNotification ServerWasDiscovered;
-
- // Ðтот метод Ñтартует Ñлушание пакетов. Тут ничего оÑобо удивительного
- public static void Start()
- {
- if (servSock != null || servThread != null)
- throw new InvalidOperationException("Already in progress");
-
- servThread = new Thread(new ThreadStart(ServerFunc));
- servThread.Start();
- }
-
- // ОÑтанов Ñервера
- public static void Stop()
- {
- if (servThread != null)
- {
- servThread.Abort();
- servThread = null;
- }
- if (servSock != null)
- {
- servSock.Close();
- servSock = null;
- }
- }
- }
|