C # Синхронный клиентский сокет получает до терминатора - PullRequest
0 голосов
/ 11 ноября 2019

Я работаю над приложением, в котором мне нужно подключиться к TCP-серверу, который использует \r в качестве символа завершения для своих сообщений. Я использую синхронные сокеты и жду, пока символ завершения не будет получен в цикле while. Часть кода приведена ниже, и я не уверен, что это лучший способ сделать то, что я хочу сделать - можете ли вы указать мне правильное направление.

    public string Receive(string terminator)
    {
        if (!_socket.Connected) return "";

        var sb = new StringBuilder();
        var remoteData = "";
        int totalBytesReceived = 0;
        int bytesReceived = 0;

        while (!remoteData.Contains(terminator))
        {
            try
            {
                bytesReceived = _socket.Receive(_bytes);
                totalBytesReceived += bytesReceived;
                remoteData = Encoding.ASCII.GetString(_bytes, 0, bytesReceived);
                Console.WriteLine($"DEBUG INFO: {Encoding.ASCII.GetString(_bytes, 0, bytesReceived)}");
                sb.Append(remoteData);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Exception when trying to receive data: {e.Message}");
                throw;
            }
        }

        var receivedString = sb.ToString();
        receivedString = receivedString.Substring(0, ( receivedString.IndexOf(terminator) + 1 ) );

        return receivedString;
    }

Вот пример полученных сообщений. Обратите внимание, что последовательность \r\n добавляется с помощью Console.WriteLine():

DEBUG INFO: #000 100\r\n
DEBUG INFO: 0110100? 1140 1360 062 169 169 0035 00 000000000\r\n
DEBUG INFO: 000010000000 OFF.\r
\r\n

Фактическое возвращаемое значение функции - #000 1000110100? 1140 1360 062 169 169 0035 00 000000000000010000000 OFF.\r.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...