Сокет, отправляющий длинные строки с нулем - PullRequest
1 голос
/ 05 мая 2011

Привет, ребята, у меня есть проблема в настоящее время при использовании Socket для отправки данных.

В настоящее время у меня возникает очень странная проблема, когда клиент отправляет на сервер, например, «СЕРДЦЕ», в виде сердцебиения. После отправки в первый раз сервер начинает получать целую партию \ 0, не всегда такую ​​же сумму до СЕРДЦА. Я использую очереди для постановки в очередь на отправку, поэтому на медленных соединениях он ожидает текущей отправки, прежде чем отправит следующую, но для крошечных отрезков времени я немного запутался.

    public void Send(string data)
    {
        if (Connected)
        {
            SendQueue.Enqueue(data);
            if (t.ThreadState == ThreadState.Stopped)
            {
                t = new Thread(new ThreadStart(SendData));
                t.Start();
            }
            else if (t.ThreadState == ThreadState.Unstarted)
                t.Start();
        }
    }

и функция SendData

    private void SendData()
    {
        if (sending)
            return;
        sending = true;
        while (SendQueue.Count > 0)
        {
            if (ClientSocket.Connected)
            {
                byte[] data = Networking.StringToByte((string)SendQueue.Dequeue());
                ClientSocket.Send(data);
            }
        }
        sending = false;
    }

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

принимающая сторона еще проще.

    public string Receive()
    {
        string msg = "";
        if (Connected)
        {
            byte[] data = new byte[1024];
            while (ClientSocket.Avaliable > 0)
            {
                ClientSocket.Receive(data);
                msg += Networking.ByteToString(data).Trim();
            }
        }
        return msg;
    }

Если бы кто-то мог указать, где я иду не так, или если я пошел по этому пути, то это совершенно неправильный путь, который был бы великолепен. Спасибо, ребята.

Я напомню людям, что это, по-видимому, случайная длина \ 0 каждые 2 секунды (в этом примере для сердцебиения сообщения СЕРДЦЕ)

1 Ответ

2 голосов
/ 05 мая 2011

Этот фрагмент кода не может быть правильным:

    byte[] data = new byte[1024];
    while (ClientSocket.Avaliable > 0)
    {
        ClientSocket.Receive(data);
        msg += Networking.ByteToString(data).Trim();
    }

Кажется, вы не учитываете, сколько данных вы на самом деле получаете. Вы должны взглянуть на возвращаемое значение из ClientSocket.Receive Я не знаю, что делает ваш Networking.ByteToString, но когда ваш код выполняет Networking.ByteToString, эта функция не может знать, сколько данных вы на самом деле получили. Вероятно, он преобразует весь буфер - все 1024 байта. И это, вероятно, откуда все ваши нули. Возможно, где-то вы делаете аналогичную вещь на отправляющей стороне.

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

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