Beispiel #1
0
        private async Task <Result> Write(byte[] data, Result resultInput)
        {
            Result     result = resultInput;
            DataWriter writer;

            using (writer = new DataWriter(_socket.OutputStream))
            {
                // Set the Unicode character encoding for the output stream
                writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                // Specify the byte order of a stream.
                writer.ByteOrder = ByteOrder.LittleEndian;

                // Gets the size of UTF-8 string.
                writer.MeasureString(Encoding.UTF8.GetString(data));
                // Write a string value to the output stream.
                writer.WriteBytes(data);

                // Send the contents of the writer to the backing stream.
                try
                {
                    await writer.StoreAsync();

                    await writer.FlushAsync();
                }
                catch (Exception ex)
                {
                    SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
                    result.ErrorMessage = (webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
                    return(result);
                }
                // In order to prolong the lifetime of the stream, detach it from the DataWriter
                writer.DetachStream();
            }
            return(result);
        }
Beispiel #2
0
        public async void SendMessage(string message)
        {
            try
            {
                using (DatagramSocket dataGramSocket = new DatagramSocket())
                {
                    using (Stream outputStream =
                               (await dataGramSocket.GetOutputStreamAsync(RemoteHostName, _remotePortNumber))
                               .AsStreamForWrite())
                    {
                        using (StreamWriter streamWriter = new StreamWriter(outputStream))
                        {
                            await streamWriter.WriteLineAsync(message);

                            await streamWriter.FlushAsync();
                        }
                    }
                }

                Debug.WriteLine($"Message sent: \"{message}\"");
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                Debug.WriteLine(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
        private async Task <string> StartServerTask(string serverSocketKey, string iface, int port)
        {
            PluginResult result = new PluginResult();

            try
            {
                ISocketServerAdapter socketServerAdapter = new SocketServerAdapter(socketStorage, dataConsumeDelegate, closeEventDelegate, errorDelegate);

                socketServerAdapter.StoppedEventHandler = async(hasError) => await StoppedEventHandler(serverSocketKey, hasError);

                socketServerAdapter.OpenedEventHandler = async(socketKey) => await OpenedEventHandler(serverSocketKey, socketKey);

                socketStorage.AddServerSocket(serverSocketKey, socketServerAdapter);
                socketServerAdapter.Start(iface, port);
                result.Result = PluginResult.Status.OK;
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
                var message = webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message;
                result.Result  = PluginResult.Status.IO_EXCEPTION;
                result.Message = message;
            }

            JsonObject jsonObject = new JsonObject();

            jsonObject.SetNamedValue("Result", JsonValue.CreateNumberValue((int)result.Result));
            if (result.Message != null)
            {
                jsonObject.SetNamedValue("Message", JsonValue.CreateStringValue(result.Message));
            }

            return(jsonObject.ToString());
        }
Beispiel #4
0
        void MessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs eventArguments)
        {
            try
            {
                eventArguments.GetDataReader().ReadBytes(receiveBytes);

                listener.onEvent(ByteArrayToEventData(receiveBytes));
            }
            catch (Exception exception)
            {
                SocketErrorStatus socketError = SocketError.GetStatus(exception.HResult);
                if (socketError == SocketErrorStatus.ConnectionResetByPeer)
                {
                    // This error would indicate that a previous send operation resulted in an
                    // ICMP "Port Unreachable" message.
                    Debug.Log(
                        "Peer does not listen on the specific port. Please make sure that you run step 1 first " +
                        "or you have a server properly working on a remote server.");
                }
                else if (socketError != SocketErrorStatus.Unknown)
                {
                    Debug.Log(
                        "Error happened when receiving a datagram: " + socketError.ToString()
                        );
                }
                else
                {
                    throw;
                }
            }
        }
Beispiel #5
0
        ////////////////////////////////////////////////////////////////////////
        // Establish Connection
        public async void Connect()
        {
            // Reset.
            Disconnect();
            this.client = new StreamSocket();
            this.connectionCancellationTokenSource = new CancellationTokenSource();
            this.sendCancellationTokenSource       = new CancellationTokenSource();
            this.flagConnected = false;
            try {
                this.connectionCancellationTokenSource.CancelAfter(this.timeout);
                await this.client.ConnectAsync(new HostName(this.remoteIP), this.remotePort.ToString())
                .AsTask(this.connectionCancellationTokenSource.Token);

                StartSending();
                this.flagConnected = true;
                // Acknowledge.
                                #if DEBUG
                DebugUtilities.UniversalDebug(this.sourceName, "Connection Stablished!", ref this.debugMessages);
                                #endif
                // return true;
            } catch (TaskCanceledException) {
                                #if DEBUGWARNING
                DebugUtilities.UniversalWarning(this.sourceName, "Failed to connect", ref this.debugMessages);
                                #endif
            } catch (Exception exception) {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(exception.GetBaseException().HResult);
                string            errorMessage   = (webErrorStatus.ToString() != "Unknown") ? webErrorStatus.ToString() : exception.Message;
                                #if DEBUGWARNING
                DebugUtilities.UniversalWarning(this.sourceName, "UnhandledException: " + errorMessage, ref this.debugMessages);
                                #endif
                // return false;
            }
        }
Beispiel #6
0
 void MessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs eventArguments)
 {
     try
     {
         uint stringLength = eventArguments.GetDataReader().UnconsumedBufferLength;
         NotifyUserFromAsyncThread(
             "Receive data from remote peer: \"" +
             eventArguments.GetDataReader().ReadString(stringLength) + "\"",
             NotifyType.StatusMessage);
     }
     catch (Exception exception)
     {
         SocketErrorStatus socketError = SocketError.GetStatus(exception.HResult);
         if (socketError == SocketErrorStatus.ConnectionResetByPeer)
         {
             // This error would indicate that a previous send operation resulted in an
             // ICMP "Port Unreachable" message.
             NotifyUserFromAsyncThread(
                 "Peer does not listen on the specific port. Please make sure that you run step 1 first " +
                 "or you have a server properly working on a remote server.",
                 NotifyType.ErrorMessage);
         }
         else if (socketError != SocketErrorStatus.Unknown)
         {
             NotifyUserFromAsyncThread(
                 "Error happened when receiving a datagram: " + socketError.ToString(),
                 NotifyType.ErrorMessage);
         }
         else
         {
             throw;
         }
     }
 }
Beispiel #7
0
        private async void StartServer()
        {
            try
            {
                _streamSocketListener = new StreamSocketListener();

                // The ConnectionReceived event is raised when connections are received.
                _streamSocketListener.ConnectionReceived += StreamSocketListener_ConnectionReceived;

                // Start listening for incoming TCP connections on the specified port. You can specify any port that's not currently in use.
                await _streamSocketListener.BindServiceNameAsync(PortNumber);

                Debug.WriteLine("server is listening...", "TcpSocketServer");
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                string            errorMessage   = webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message;
                Debug.WriteLine(errorMessage);
                Error.Message         = errorMessage;
                Error.DetailedMessage = ex.ToString();
                Error.Unacknowledged  = true;
                ListenForConnections  = false;
            }
        }
Beispiel #8
0
        private async Task <Tuple <Result, byte[]> > Read(Result resultInput)
        {
            Result        result = resultInput;
            DataReader    reader;
            StringBuilder strBuilder;

            using (reader = new DataReader(_socket.InputStream))
            {
                strBuilder = new StringBuilder();

                // Set the DataReader to only wait for available data (so that we don't have to know the data size)
                reader.InputStreamOptions = InputStreamOptions.Partial;
                // The encoding and byte order need to match the settings of the writer we previously used.
                reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                reader.ByteOrder       = ByteOrder.LittleEndian;

                // Send the contents of the writer to the backing stream.
                // Get the size of the buffer that has not been read.
                try
                {
                    do
                    {
                        await reader.LoadAsync(_readBuffer);

                        strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));
                        // Keep reading until we consume the complete stream.
                    }while (reader.UnconsumedBufferLength > 0);
                }
                catch (Exception ex)
                {
                    SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                    result.ErrorMessage = (webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
                    var RSP_packet2 = new byte[strBuilder.ToString().Length];
                    return(new Tuple <Result, byte[]>(result, RSP_packet2));
                }
                finally
                {
                    reader.DetachStream();
                }
            }
            var RSP_packet = new byte[strBuilder.ToString().Length];

            RSP_packet = Encoding.UTF8.GetBytes(strBuilder.ToString());
            return(new Tuple <Result, byte[]>(result, RSP_packet));
        }
Beispiel #9
0
        /// <summary>
        /// 建立连接
        /// </summary>
        /// <returns>成功/失败</returns>
        public async Task <bool> BuiildConnectionAsync()
        {
            bool          result = false;
            List <string> error  = new List <string>();

            for (int i = 0; i < ip_address.Count; i++)
            {
                try
                {
                    await this.socket.ConnectAsync(new HostName(ip_address[i]), port[i]);

                    result = true;
                    break;
                }
                catch (Exception ex)
                {
                    SocketErrorStatus errorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
                    error.Add(errorStatus.ToString() != "Unknown" ? errorStatus.ToString() : ex.Message);
                    continue;
                }
            }
            if (result == false)
            {
                ContentDialog connectFailedDialog = new ContentDialog
                {
                    Title           = "ConnectionFailed",
                    Content         = "",
                    CloseButtonText = "Ok"
                };

                for (int i = 0; i < error.Count; i++)
                {
                    connectFailedDialog.Content += ("Time " + i.ToString() + ": " + error[i] + ".\n");
                }

                connectFailedDialog.Content += "\n Please check your connection status and try again later.";
                await connectFailedDialog.ShowAsync();
            }

            ifConnected = result;
            return(result);
        }
Beispiel #10
0
        private async void StartServer()
        {
            try
            {
                DatagramSocket dataGramSocket = new DatagramSocket();

                dataGramSocket.MessageReceived += DataGramSocket_MessageReceived;

                Debug.WriteLine("Server is about to bind...");

                await dataGramSocket.BindServiceNameAsync(_listeningPortNumber);

                Debug.WriteLine($"Server is bound to {_listeningPortNumber}");
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                Debug.WriteLine(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
Beispiel #11
0
        public async Task <Result> Connect(string Port, string IP)
        {
            Result result = new Result();

            _socket = new StreamSocket();
            GC.Collect(); // Clean garbage collection
            try
            {
                await _socket.ConnectAsync(new HostName(IP), Port);

                result.Succeeded = true;
                return(result);
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                result.ErrorMessage = (webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
                return(result);
            }
        }
Beispiel #12
0
        public async void StartClient()
        {
            if (!running)
            {
                try
                {
                    //Create the DatagramSocket and establish a connection to the server.
                    socket = new DatagramSocket();

                    //Set Low Latency mode for the socket
                    socket.Control.QualityOfService = SocketQualityOfService.LowLatency;

                    //Set don't fragment
                    socket.Control.DontFragment = true;

                    //The ConnectionReceived event is raised when connections are received.
                    socket.MessageReceived += MessageReceived;

                    // The server hostname that we will be establishing a connection to.
                    hostName = new HostName(IP);

                    Debug.WriteLine("Client is about to bind...");

                    await socket.BindServiceNameAsync(Port);

                    Debug.WriteLine("Client is bound to port number " + Port);

                    try
                    {
                        Stream output = (await socket.GetOutputStreamAsync(hostName, Port)).AsStreamForWrite();
                        writer = new BinaryWriter(output);

                        new Connecting().WriteData(writer);
                        //await writer.FlushAsync();
                        writer.Flush();
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine(e.Message);
                    }

                    running = true;
                }
                catch (Exception e)
                {
                    SocketErrorStatus status = SocketError.GetStatus(e.GetBaseException().HResult);
                    Debug.WriteLine(status.ToString() + " : " + e.Message);
                }
            }
            else
            {
                throw new ArgumentException("Client already running!");
            }
        }
        //--------------------------------------------------------Set-, Get- Methods:---------------------------------------------------------\\
        #region --Set-, Get- Methods--


        #endregion
        //--------------------------------------------------------Misc Methods:---------------------------------------------------------------\\
        #region --Misc Methods (Public)--
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder("[ConnectionError] ");

            sb.Append("SOCKET_ERROR: ");
            sb.Append(SOCKET_ERROR.ToString());
            sb.Append(", ERROR_CODE: ");
            sb.Append(ERROR_CODE.ToString());
            sb.Append(", ERROR_MESSAGE: ");
            sb.Append(ERROR_MESSAGE ?? "NULL");
            return(sb.ToString());
        }
Beispiel #14
0
        public async void StartServer()
        {
            try
            {
                streamSocketListener = new StreamSocketListener();

                // The ConnectionReceived event is raised when connections are received.
                streamSocketListener.ConnectionReceived += StreamSocketListener_ConnectionReceived;

                // Start listening for incoming TCP connections on the specified port. You can specify any port that's not currently in use.
                await streamSocketListener.BindServiceNameAsync(PortNumber);

                serverIsRunning = true;
                ServerItems.Add(string.Format("server is listening on port {0} ...", PortNumber));
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                ServerItems.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
Beispiel #15
0
        private async void StreamSocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            bool clientconnected = true;

            await CoreApplication.MainView.CoreWindow.
            Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                                () => ServerItems.Add(string.Format("client connected from {0}:{1} ...",
                                                                    args.Socket.Information.RemoteAddress, args.Socket.Information.RemotePort)));

            while (clientconnected)
            {
                try
                {
                    string request;
                    if (streamReader == null)
                    {
                        streamReader = new StreamReader(args.Socket.InputStream.AsStreamForRead());
                    }

                    request = await streamReader.ReadLineAsync();


                    await CoreApplication.MainView.CoreWindow.
                    Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                                        () => ServerItems.Add(string.Format("server received the request: \"{0}\"", request)));

                    // Echo the request back as the response.
                    if (streamWriter == null)
                    {
                        Stream ServeroutputStream = args.Socket.OutputStream.AsStreamForWrite();
                        streamWriter = new StreamWriter(ServeroutputStream);
                    }

                    await streamWriter.WriteLineAsync(request);

                    await streamWriter.FlushAsync();

                    await CoreApplication.MainView.CoreWindow.Dispatcher.
                    RunAsync(CoreDispatcherPriority.Normal,
                             () => ServerItems.Add(string.Format("server sent back the response: \"{0}\"", request)));
                }
                catch (Exception ex)
                {
                    clientconnected = false;
                    CloseServerConnection();
                    SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                    await CoreApplication.MainView.CoreWindow.Dispatcher.
                    RunAsync(CoreDispatcherPriority.Normal,
                             () => ServerItems.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message));
                }
            }
        }
Beispiel #16
0
        public async void StartClient()
        {
            try
            {
                // Create the StreamSocket and establish a connection to the echo server.
                streamSocket = new StreamSocket();
                // The server hostname that we will be establishing a connection to. In this example, the server and client are in the same process.
                var hostName = new Windows.Networking.HostName(ServerAddress);

                ClientItems.Add(string.Format("client is trying to connect to {0}:{1} ...", ServerAddress, ServerPort));

                await streamSocket.ConnectAsync(hostName, ServerPort);

                clientIsConnected = true;
                ClientItems.Add("client connected");
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                ClientItems.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
Beispiel #17
0
        public async void SendClientMessage()
        {
            try {
                // Send a request to the echo server.
                //string request = "Hello, World!";
                if (outputStream == null)
                {
                    outputStream = streamSocket.OutputStream.AsStreamForWrite();
                }

                var streamWriter = new StreamWriter(outputStream);

                await streamWriter.WriteLineAsync(ClientMessage);

                await streamWriter.FlushAsync();

                ClientItems.Add(string.Format("client sent the request: \"{0}\"", ClientMessage));

                // Read data from the echo server.
                string response;
                if (inputStream == null)
                {
                    inputStream = streamSocket.InputStream.AsStreamForRead();
                }
                StreamReader streamReader = new StreamReader(inputStream);

                response = await streamReader.ReadLineAsync();

                ClientItems.Add(string.Format("client received the response: \"{0}\" ", response));
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                ClientItems.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
                CloseClient();
            }
        }
Beispiel #18
0
        private async void StartServer()
        {
            try
            {
                var streamSocketListener = new StreamSocketListener();
                //接收到连接时将引发ConnectionReceived事件。
                streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;
                ////开始监听指定端口上传入的TCP连接。您可以指定当前未使用的任何端口。
                await streamSocketListener.BindServiceNameAsync(StreamSocketAndListenerPage.PortNumber);

                this.serverListBox.Items.Add("server is listening...");
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                this.serverListBox.Items.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
        // Constantly check for new messages on given port.
        private async void ReceiveConnection()
        {
            try {
                // Open.
                this.listener = new StreamSocketListener();
                this.listener.ConnectionReceived += OnClientFound;
                await this.listener.BindServiceNameAsync(this.localPort.ToString());

                                #if DEBUG
                DebugUtilities.UniversalDebug(this.sourceName, "Started Listening for Incoming Connections.", ref this.debugMessages);
                                #endif
            } catch (Exception exception) {
                // Exception.
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(exception.GetBaseException().HResult);
                string            webError       = (webErrorStatus.ToString() != "Unknown") ? webErrorStatus.ToString() :
                                                   exception.Message;
                                #if DEBUGWARNING
                DebugUtilities.UniversalWarning(this.sourceName, "Exception: " + webError, ref this.debugMessages);
                                #endif
            }
        }
Beispiel #20
0
        private async void StartServer()
        {
            try
            {
                //instantitate a listener
                var streamSocketListener = new StreamSocketListener();

                //挂接事件处理器。
                //每次连接后,就会调用事件处理器,接受请求,回复请求。不知道是不是每次发送都需要来回收发,最好的状态是建立一次连接,然后随便发送最好。
                // The ConnectionReceived event is raised when connections are received.
                streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;

                //开始监听。
                // Start listening for incoming TCP connections on the specified port. You can specify any port that's not currently in use.
                await streamSocketListener.BindServiceNameAsync("8080");
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                this.serverListBox.Items.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
Beispiel #21
0
        public async void StartServer()
        {
            if (!running)
            {
                try
                {
                    socket = new DatagramSocket();

                    //Set Low Latency mode for the socket
                    socket.Control.QualityOfService = SocketQualityOfService.LowLatency;

                    //Set don't fragment
                    socket.Control.DontFragment = true;

                    //The ConnectionReceived event is raised when connections are received.
                    socket.MessageReceived += MessageReceived;

                    Debug.WriteLine("Server is about to bind...");

                    //Start listening for incoming UDP connections on the specified port. You can specify any port that's not currently in use.
                    await socket.BindServiceNameAsync(Port);

                    Debug.WriteLine("Server is bound to port number " + Port);
                    running = true;
                }
                catch (Exception e)
                {
                    SocketErrorStatus status = SocketError.GetStatus(e.GetBaseException().HResult);
                    Debug.WriteLine(status.ToString() + " : " + e.Message);
                }
            }
            else
            {
                throw new ArgumentException("Server already running!");
            }
        }
        // ugly but somewhat functional
        private async Task allowRemoteControl()
        {
            TaskCompletionSource <bool> canStopListening = new TaskCompletionSource <bool>();

            try {
                var streamSocketListener = new StreamSocketListener();
                streamSocketListener.ConnectionReceived += async
                                                               (StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) => {
                    Debug.WriteLine("TCP: connection received");
                    string request;
                    using (var streamReader = new StreamReader(args.Socket.InputStream.AsStreamForRead())) {
                        while (true)
                        {
                            request = await streamReader.ReadLineAsync();

                            Debug.WriteLine("TCP <- " + request);
                            if (request.StartsWith("close"))
                            {
                                canStopListening.SetResult(true);
                                args.Socket.Dispose();
                            }
                            if (request.StartsWith("serial"))
                            {
                                string sFromUART = await m_rOvenManager.readFromUART();

                                Debug.WriteLine("UART <- " + sFromUART);
                            }
                            else if (request.StartsWith("konami"))
                            {
                                await sendInputSequence(KONAMI_CODE);;
                            }
                            else if (request.StartsWith("JP"))
                            {
                                await sendInputSequence(INGR_1);
                            }
                            else if (request.StartsWith("PP"))
                            {
                                await sendInputSequence(INGR_2);
                            }
                            else if (request.StartsWith("MR"))
                            {
                                await sendInputSequence(INGR_3);
                            }
                            else if (request.StartsWith("SA"))
                            {
                                await sendInputSequence(INGR_4);
                            }
                            else         // key press/release - request is one of [U|D|L|R][0|1]
                            {
                                OvenManager.eBtn      btn      = s_rLetterToBtnMapping[request[0]];
                                OvenManager.eBtnState btnState = request[1] == '0' ?
                                                                 OvenManager.eBtnState.PRESSED : OvenManager.eBtnState.UNPRESSED;
                                m_rOvenManager.setBtn(btn, btnState);
                            }
                        }
                    }
                };
                await streamSocketListener.BindServiceNameAsync("12345");

                Debug.WriteLine("TCP: waiting for connections");
                await canStopListening.Task;
                Debug.WriteLine("TCP: closing");
                streamSocketListener.Dispose();
            } catch (Exception ex) {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                Debug.WriteLine(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
            }
        }
Beispiel #23
0
        public async Task <Result> ReadVariable(string pVarName)
        {
            Result result = new Result();

            // Read Variable request packet structure example:
            //   0  1     2  3        4       5  6
            //  xx xx  | 00 0A   |   00    | 00 07        | 24 4F 56 5F 50 52 4F
            //         |   10    |    0    |     7        | $  O  V  _  P  R  O
            //  REQ ID | REQ LEN | READ=00 | VAR NAME LEN | VAR NAME CHARS
            // (RANDOM)|

            if (pVarName.Length == 0)
            {
                result.ErrorMessage = "No variable was written";
                return(result);
            }

            var PKT_var_name = new byte[pVarName.Length];

            PKT_var_name = Encoding.UTF8.GetBytes(pVarName);

            var PKT_name_length = new byte[2];

            PKT_name_length[0] = (byte)((pVarName.Length >> 8) & 255);
            PKT_name_length[1] = (byte)(pVarName.Length & 255);

            byte PKT_mode_is_read = 0;

            var PKT_req_len = new byte[2];

            PKT_req_len[0] = (byte)(((pVarName.Length + 3) >> 8) & 255);
            PKT_req_len[1] = (byte)((pVarName.Length + 3) & 255);

            var PKT_req_id = new byte[2];

            PKT_req_id[0] = (byte)((_msgID >> 8) & 255);
            PKT_req_id[1] = (byte)(_msgID & 255);
            _msgID++;
            if (_msgID > _lastID)
            {
                _msgID = _firstID;
            }

            var REQ_packet = new byte[pVarName.Length + 7 + 1];

            REQ_packet[0] = PKT_req_id[0];
            REQ_packet[1] = PKT_req_id[1];
            REQ_packet[2] = PKT_req_len[0];
            REQ_packet[3] = PKT_req_len[1];
            REQ_packet[4] = PKT_mode_is_read;
            REQ_packet[5] = PKT_name_length[0];
            REQ_packet[6] = PKT_name_length[1];
            PKT_var_name.CopyTo(REQ_packet, 7);

            DataWriter writer;

            using (writer = new DataWriter(_socket.OutputStream))
            {
                // Set the Unicode character encoding for the output stream
                writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                // Specify the byte order of a stream.
                writer.ByteOrder = ByteOrder.LittleEndian;

                // Gets the size of UTF-8 string.
                writer.MeasureString(Encoding.UTF8.GetString(REQ_packet));
                // Write a string value to the output stream.
                writer.WriteBytes(REQ_packet);

                // Send the contents of the writer to the backing stream.
                try
                {
                    await writer.StoreAsync();

                    await writer.FlushAsync();
                }
                catch (Exception ex)
                {
                    SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
                    result.ErrorMessage = (webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
                    return(result);
                }
                // In order to prolong the lifetime of the stream, detach it from the DataWriter
                writer.DetachStream();
            }

            // Read Variable response packet structure example:
            // 0  1     2  3      4         5  6
            // xx xx  | 00 0A   | 00      | 00 06       | 35 35 33 39 39 33 | 00 01 01
            //        |   10    |  0      |     6       | 5  5  3  9  9  3  |  0  1  1
            // SAME AS| RSP LEN | READ=00 | VALUE LEN   | VALUE CHARS       |  TRAILER
            // REQUEST|

            DataReader  reader;
            ByteBuilder byteBuilder = new ByteBuilder();

            using (reader = new DataReader(_socket.InputStream))
            {
                // Read the length of the payload that will be received.
                reader.InputStreamOptions = InputStreamOptions.Partial;
                // The encoding and byte order need to match the settings of the writer we previously used.
                reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                reader.ByteOrder       = ByteOrder.LittleEndian;
                // Send the contents of the writer to the backing stream.
                // Get the size of the buffer that has not been read.
                try
                {
                    do
                    {
                        await reader.LoadAsync(_readBuffer);

                        var bytes = new Byte[reader.UnconsumedBufferLength];
                        reader.ReadBytes(bytes);
                        byteBuilder.AppendBytes(bytes);
                        // Keep reading until we consume the complete stream.
                    }while (reader.UnconsumedBufferLength > 0);
                }
                catch (Exception ex)
                {
                    SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                    result.ErrorMessage = (webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
                    return(result);
                }
                finally
                {
                    reader.DetachStream();
                }
            }

            var flattenedList = byteBuilder._bytes.SelectMany(bytes => bytes);
            var RSP_packet    = flattenedList.ToArray();

            try
            {
                int RSP_len     = (RSP_packet[2] << 8) | RSP_packet[3];
                int RSP_val_len = (RSP_packet[5] << 8) | RSP_packet[6];
                result.Data = Encoding.ASCII.GetString(RSP_packet, 7, RSP_val_len);
                int RSP_read_status = RSP_packet[7 + (RSP_val_len + 2)];
                if ((RSP_read_status > 0) & (RSP_val_len > 0) &
                    (RSP_packet[0] == PKT_req_id[0]) & (RSP_packet[1] == PKT_req_id[1]))
                {
                    result.Succeeded = true;
                    return(result);
                }
                else
                {
                    result.ErrorMessage = "Cannot be read";
                    return(result);
                }
            }
            catch (Exception ex)
            {
                result.ErrorMessage = ex.Message;
                return(result);
            }
        }