Это хороший способ, чтобы получить сообщение от сервера?


Я разрабатываю программное обеспечение, которое использует очень древний низкого уровня TCP/IP-протокол от (Я думаю) восьмидесятые. Я могу отправлять сообщения очень надежно к серверу, но я немного не уверены о получении их. Я не могу предсказать, когда сервер будет отправлять мне сообщение, так что я этот метод в бесконечный цикл. GetNextMessage() блокирует поток, пока он не получает сообщение, после чего сообщение будет обработано, и цикл повторяется.

Сообщения передаются со скоростью около 5 или 6 минут, и я могу их обработать менее чем за четверть секунды, так что я не в настоящее время выделение в новую тему, когда я получу их.

Этот фрагмент кода содержит все необходимые символы и логика, что я не уверен:

    /// this is filled earlier in the program
    private Socket _socket;

    private const int BufferSize = 4096;

    /// <summary>
    /// This byte (hex 02) indicates the start of the message.
    /// </summary>
    private const byte RecordStart = 2;

    /// <summary>
    /// This byte (hex 03) indicates the end of the message.
    /// </summary>
    private const byte RecordEnd = 3;

    private string GetNextMessage()
    {
        byte[] bytesReceived = new byte[BufferSize];

        // ReSharper disable PossibleNullReferenceException
        _socket.Receive(bytesReceived);
        // ReSharper restore PossibleNullReferenceException

        if (_socket.Poll(1, SelectMode.SelectRead))
        {
            throw new SocketException((int)SocketError.ConnectionReset);
        }

        IEnumerable<byte> bytes = bytesReceived
            .Where(character => character != RecordStart)
            .TakeWhile(character => character != RecordEnd);

        return Encoding.ASCII.GetString(bytes.ToArray());
    }

Мои опасения:

  1. Я не уверен, если _socket.Опрос () - это правильный способ определить, если сокет ушел. Это, безусловно, работает, и это очень необходимо, но я уверен, что я должен делать что-то еще.
  2. Я однажды делал операцию, что немедленно послал три сообщения друг за другом, но я появлялся только, чтобы получить два из них. Возможно, что есть ошибка в продукте, я занимаюсь разработкой ПО (вероятно), но я боюсь, что метод я выбрал почему-то вызывает сообщения будут отброшены.


391
3
c#
задан 8 июля 2011 в 02:07 Источник Поделиться
Комментарии
2 ответа

Одна вещь я делаю с чтением из розетки-это отдельная получение данных какие данные содержит.

Смысл, вы можете получить информацию в прогрессивной куски..... так что получить набор данных, а затем посмотреть, если у вас есть полный "сообщение". Если нет, то ждать следующего блока данных. Когда у тебя полный "сообщение", то вы можете передать это тем, что хочет он.

В том, что я сделал-это абстрактная идея потокового соединения, так что я могу обмена последовательных портов / сокетов TCP / или любой другой потоковый тип соединения. Есть что-то, что получает от связи, а потом делать перевод.

3
ответ дан 12 июля 2011 в 02:07 Источник Поделиться

Ответ: 1. Вот лучший способ проверить, если сокет был отключен.

    bool SocketConnected(Socket s)
{
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 & part2)
return false;
else
return true;
}

1
ответ дан 11 июля 2011 в 05:07 Источник Поделиться