/// <summary> /// Конструктор класса UDP /// </summary> /// <param name="servicePort">локальный служебный порт (ПИ)</param> /// <param name="debugPort">локальный отладочный порт (ПИ)</param> /// <param name="portSendTo">удаленный служебный порт (ПУС)</param> public Udp(int servicePort, int debugPort, int portSendTo) { //--УДАЛИТЬ нужно! Это временная отладка для другого проекта! //servicePort = 0; portSendTo = 40100; //strIPAddr = "192.168.0.100"; //------------------------------------------- socketService = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socketDebug = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _addr = IPAddress.Parse(strIPAddr); _servicePort = servicePort; _debugPort = debugPort; _portSendTo = portSendTo; state_rx = STATE_RX.DESCR; command_in_servicePort = new UDPCommand(); command_in_debugPort = new UDPCommand(); remotePoint = new IPEndPoint(_addr, _portSendTo); bIsClosed = false; listenTaskDebugPort = new Task(ListenDebugPort); //Запускаем прослушивание портов в отдельных потоках listenTaskDebugPort.Start(); listenTaskServicePort = new Task(ListenServicePort); listenTaskServicePort.Start(); token = cancelTokenSource.Token; }
/// <summary> /// Обработчик прослушивания порта. Поток для приема подключений /// </summary> /// <param name="port">Порт для прослушивания</param> /// <param name="com">В какую команду формируем входящие данные</param> void ListenService(int port, UDPCommand com) { Socket socket = socketService; //Привязываем сокет к нужному адресу и порту, который будем прослушивать //_addr = IPAddress.Any; pointPort = new IPEndPoint(_addr, port); socket.Bind(pointPort); //Адрес, с которого пришли данные. //socket.ReceiveTimeout = 5000; byte[] data = new byte[256]; while (true) { try { int bytes = 0; if (token.IsCancellationRequested) { socket.Close(); return; } EndPoint remoteIP = new IPEndPoint(IPAddress.Any, 0); do { bytes = socket.ReceiveFrom(data, ref remoteIP); }while (socket.Available > 0); com.descriptor = data[0]; com.data = new byte[bytes]; Array.Copy(data, 1, com.data, 0, bytes); IPEndPoint remoteFullIp = remoteIP as IPEndPoint; //получаем данные о подключении receivedService?.Invoke(com, remoteFullIp); //генерируем событие } catch (Exception ex) { if (!bIsClosed) { warningException?.Invoke("SocketService \n\r" + ex.Message); //генерируем событие о возникшей ошибке } } finally { //Close(); } } }
public bool SendCommand(UDPCommand com) { try { byte[] buf = new byte[com.data.Length + 1]; buf[0] = com.descriptor; Array.Copy(com.data, 0, buf, 1, com.data.Length); socketService.SendTo(buf, remotePoint); //отправка сообщения на удаленный адрес return(true); } catch { return(false); } }
void ListenDebug(int port, UDPCommand com) { Socket socket = socketDebug; //Привязываем сокет к нужному адресу и порту, который будем прослушивать pointPort = new IPEndPoint(_addr, port); socket.Bind(pointPort); //Адрес, с которого пришли данные. //socket.ReceiveTimeout = 5000; byte[] data = new byte[256]; while (true) { try { int bytes = 0; if (token.IsCancellationRequested) { socket.Close(); return; } EndPoint remoteIP = new IPEndPoint(IPAddress.Any, 0); do { bytes = socket.ReceiveFrom(data, ref remoteIP); }while (socket.Available > 0); com.descriptor = data[0]; com.data = new byte[bytes]; Array.Copy(data, 1, com.data, 0, bytes); IPEndPoint remoteFullIp = remoteIP as IPEndPoint; //получаем данные о подключении receivedDebug?.Invoke(com, remoteFullIp); //генерируем событие /*if (socket.Available > 0) * { * byte[] tmp = new byte[socket.Available]; * bytes = socket.ReceiveFrom(tmp, ref remoteIP); * foreach (byte b in tmp) rx_queue.Enqueue(b); * } * if (state_rx == STATE_RX.DESCR) * { * if (rx_queue.Count >= 1) * { * com.descriptor = rx_queue.Dequeue(); * state_rx = STATE_RX.DATA; * } * } * if (state_rx == STATE_RX.DATA) * { * if (rx_queue.Count >= 1) * { * com.data = new byte[rx_queue.Count]; * for (int i = 0; i < com.data.Length; i++) * com.data[i] = rx_queue.Dequeue(); * * state_rx = STATE_RX.DESCR; * rx_queue.Clear(); * * IPEndPoint remoteFullIp = remoteIP as IPEndPoint; //получаем данные о подключении * received?.Invoke(com, remoteFullIp); //генерируем событие * } * }*/ } catch (Exception ex) { warningException?.Invoke("SocketDebug \n\r" + ex.Message); //генерируем событие о возникшей ошибке } finally { //Close(); } } }