Я работаю над приложением, в котором мне нужно подключиться к 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
.