Winsock: GetData получает лишь кусочек переданного

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
D.Igel
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 21.06.2005 (Вт) 12:46

Winsock: GetData получает лишь кусочек переданного

Сообщение D.Igel » 21.06.2005 (Вт) 12:50

ПОМОЖИТЕ!! :)

В DataArrival стоит ws.GetData S. Когда ей что-то маленькое шлют, она его получает, а когда что-побольше - начальный кусочек от данных.
В РЕЖИМЕ ОТЛАДКИ ВСЕ РАБОТАЕТ!!!
Т.е., я думаю, сеть не успевает ДОпередавать до конча, как GetData цапает это? А ведь вроде никаких проверок на "получение окончено" нету? (типа sendComplete для отсылки).
И как быть?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.06.2005 (Вт) 13:04

DataArrival получает один пакет данных. Размер пакета зависит от параметров сети. Соответственно, если то, что ты пересылаешь, не влезает в один пакет, событие DataArrival будет происходить несколько раз. Встроенных способов проверки того, что пересылка закончилась, нет.

Сам недавно про это спрашивал. Вот что мне насоветовали:

http://bbs.vbstreets.ru/viewtopic.php?t=16864

D.Igel
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 21.06.2005 (Вт) 12:46

Сообщение D.Igel » 21.06.2005 (Вт) 13:19

Я пробовал что-то вроде if len(s)=byteTotal then...
Это имеется ввиду? Но у меня всегда это условие выполнялось (точнее, у НЕЕ, программы). Или я неправильно понял? Когда сервер передает кусок данных, в byteTotal ЕГО длина, или ПОЛНАЯ - с учетом того, что еще и не передано? И, кроме того, почему ж в отладочном режиме (пошаговый проход) все получается? :((

D.Igel
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 21.06.2005 (Вт) 12:46

Сообщение D.Igel » 21.06.2005 (Вт) 14:29

СПАСИБО!
Твой совет все-таки помог! :) Стал делать DoEvent для отдельных команд (которые заканчиваются на "."+vbCrLf) и эту точку ловить - получилось. Правда, так и стек мона переполнить sub'ами, но не те размеры данных от почтовика. Спасибо! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.06.2005 (Чт) 21:54

D.Igel писал(а):Я пробовал что-то вроде if len(s)=byteTotal then...
Это имеется ввиду? Но у меня всегда это условие выполнялось (точнее, у НЕЕ, программы). Или я неправильно понял? Когда сервер передает кусок данных, в byteTotal ЕГО длина, или ПОЛНАЯ - с учетом того, что еще и не передано?

Неправильно понял: в byteTotal ЕГО длина.
А DoEvents в _DataArrival - это криво. Лучше складывать все данные в буфер, и как только там появится точка - обрабатывать все сразу.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 176

    TopList