Проблема получения данных клиента сокета .Net - PullRequest
1 голос
/ 06 февраля 2011

Я реализую архитектуру Master / Slave в моем приложении.

Мастер опрашивает задания из базы данных, а затем распределяет задания среди подчиненных. Я использую сокетное соединение, чтобы поддерживать соединение между ведущим и подчиненным и отправлять задание клиенту.

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

Подтверждение - не что иное, как какое-то постоянное значение. Всякий раз, когда клиент получает это постоянное значение, клиент отправляет то же значение обратно мастеру, а если мастер получает эти постоянные значения, он отправляет задание, если оно доступно в очереди, в противном случае отправляет это же значение обратно клиенту. Таким образом, ведущий и подчиненные продолжают общаться, пока все работы не будут выполнены.

Я работаю с сервером c # windows, используя асинхронные сокеты.

Моя проблема заключается в том, что при обработке данных, полученных на стороне клиента, некоторое время клиент получает перекрывающиеся значения. Это происходит в следующем событии клиентского сокета:

public void OnDataReceived(IAsyncResult asyn)

    {

        SocketPacket theSockId = null;

        try

        {

            theSockId = (SocketPacket)asyn.AsyncState;

            int iRx = theSockId.currentSocket.EndReceive(asyn);

            char[] chars = new char[iRx + 1];

            System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();

            int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);

            System.String szData = new System.String(chars);

            if (OnDataRecievedFromMaster != null)

            {

                OnDataRecievedFromMaster(Convert.ToInt32(szData), theSockId.hostName);

            }

            //richTextRxMessage.Text = richTextRxMessage.Text + szData;

            WaitForData(theSockId.hostName);

        }

        catch (ObjectDisposedException)

        {

            System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");

        }

        catch (SocketException se)

        {

            if (se.ErrorCode == 10054) // Error code for Connection reset by peer

            {

                //string msg = "Client " + socketData.hostName + " Disconnected" + "\n";

                //AppendToRichEditControl(msg);

                // Remove the reference to the worker socket of the closed client

                // so that this object will get garbage collected

            }

        }

        finally

        {





        }

    }

в этом событии значение szdata не является исходным значением, которое действительно отправил мастер. Большую часть времени значение повторяется. Я посылаю только целочисленные значения клиенту или серверу, без строк.

Любая информация о том, почему я получаю это, будет по достоинству оценена.

1 Ответ

0 голосов
/ 06 февраля 2011

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

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