Сервер не может беспрепятственно получать байтовые данные в vb6 - PullRequest
0 голосов
/ 25 августа 2010

У меня есть отправитель, сервер пересылки сообщений, который отправляет фиксированные размеры байтов данных со скоростью 5 миллисекунд на сообщение в мою принимающую программу, написанную в vb6, когда я запускаю средство пересылки сообщений и мою принимающую программу на одной машине, нет проблема, но когда они работают на отдельных машинах, программа-получатель начинает испытывать некоторые отклонения.

например:

private sub socket_DataArrival(index as integer, ByVal dataTotal as Long)

Dim Data() as Byte
Length.Text = dataTotal

socket.GetData byteData, vbArray + vbByte

If Length.Text = "100" Then
txtOutput.Text = "Message1"

ElseIf Length.Text = "150" Then
txtOutput.text = "Message2"

End Sub

Иногда я получаю сообщение «2 в 1», так как оно имеет размер 250 байт или не распознаваемый размер байта, когда я должен получать только 100 или 150, но если я уменьшу скорость отправки до более медленной скорости, скажем, 50 миллисекунд на сообщение, тогда все будет хорошо.

Может какой-нибудь совет? Спасибо.

1 Ответ

0 голосов
/ 25 августа 2010

При отправке данных по сети вы должны привыкнуть к тому, что пакеты могут поступать не по порядку, не быстро, совсем не так, и т. Д.

Вам необходимо улучшить протокол сообщений, включив в него заголовок, в котором указано, какой тип сообщения следует. Если порядок важен, укажите порядковый номер (я предполагаю, что вы используете UDP). В настоящее время вы полагаетесь на синхронизацию отдельных сообщений, на которые нельзя полагаться по сети.

Буферизируйте все поступающие данные и обрабатывайте их порциями - заголовок позволяет указать, какой размер порции использовать. Отделите входную буферизацию от обработки сообщений - используйте событие DataArrival для добавления данных в буфер, используйте таймер или другие средства опроса буфера, чтобы проверить, есть ли у него сообщения, готовые для анализа. Увы, это VB6, поэтому многопоточность не так проста. Взгляните на Проект замены общих элементов управления DLL объекта таймера, если вам нужен класс Timer, который не зависит от присутствующего элемента пользовательского интерфейса.

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