Глюк в Winsock'е

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
AiLEX
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.09.2005 (Вс) 11:44
Откуда: Котлас

Глюк в Winsock'е

Сообщение AiLEX » 08.02.2006 (Ср) 22:45

Делаю программу, через которую можно гонять файлы по сети. У меня вопрос. Когда я посылаю первый блок (это 2048 байт), то у клиента DataArrival срабатывает два раза - в первый раз ~1,5 кб, а потом все остальное. Может нужно размер блока меньше сделать? Но тогда почему при подключении к самому себе все нармально, а в сети на 33кбита/с такие глюки?
Упала вилка на пол и как начала валяться...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.02.2006 (Чт) 7:09

Ты не имеешь права делать предположений о том, на какие пакеты будут разбиты данные. Этим занимается транспорный уровень, а не уровень приложения.

Глюк в винсоке... нды... уверенно. Годами все ловили dataarrival и накапливали в буфере ответы. Оказывается, это глюк в винсоке...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Grey_Brother
Новичок
Новичок
Аватара пользователя
 
Сообщения: 36
Зарегистрирован: 09.02.2006 (Чт) 10:36
Откуда: Санкт-Петербург

Сообщение Grey_Brother » 09.02.2006 (Чт) 11:15

Я делаю так:
Посылаю "FileName:" & NameOfFile
Жду ответа
Посылаю "FileLen:" & LenOfFile
Жду Ответа
Посылаю FileContentByteArry()
И приемник знает, когда должен закончиться файл
С уважением, GB.

AiLEX
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.09.2005 (Вс) 11:44
Откуда: Котлас

Сообщение AiLEX » 09.02.2006 (Чт) 21:27

Ну вообщем я понял, что эти 2 кб еще разбиваются на две части, уже не програмно. А вообще это от скорости зависит? При 1мбит в секунду, все доходит за один dataarrival. Просто у меня первые два байта блока несут определенную информацию, а если ее не будет, то ошибка. Я поставил размер блока 256 - сразу все заработало, но есть ли гарантия, что и при 256 будет доходить за раз на более низких скоростях или придется устанавляивать скоростной минимум?
Упала вилка на пол и как начала валяться...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.02.2006 (Пт) 3:22

Ещё раз.
Ты не имеешь права делать предположений о том, на какие пакеты будут разбиты данные. Этим занимается транспорный уровень, а не уровень приложения.

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

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

Сообщение tyomitch » 11.02.2006 (Сб) 2:00

Замечу в скобках, что на размер IP-пакета есть ограничение снизу. Например, в Ethernet 10/100 это 40 байт: если посылать данные такими кусками, то они уже гарантированно дробиться не будут ;-)

(по модему наверняка можно передавать и более мелкие пакеты)
Изображение

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 12.02.2006 (Вс) 23:36

Если ты копировал файл в переменную типа string, а потом отсылал значение этой переменной через winsock (senddata), то у тебя может возникнуть проблема, но иногда все прожодит гладко. Winsock отправляет небольшие размеры, так что дели пакеты примерно по 10кБ.
Кстати, с двойчными файлами такой способ у меня с трудом работал-при соединении всех пакетов надо не забывать о символе конца строки.

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

Сообщение tyomitch » 12.02.2006 (Вс) 23:49

Ramauf, а где гарантия, что 10Кб-пакет в пути не разобьётся? ;-)
Тем более -- какая вообще разница, какого размера куски посылаются, если у тебя получатель всё равно их склеивает?
Изображение

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:08

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

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:11

А вообще файлы надо перекачивать ни winsock'ом, ни internet transfer'ом, а апи-функцией FtpGetFile и FtpPutFile, они а Api-guide описаны и пример там есть специально для VB.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:19

Ramauf писал(а):Похоже это в winsock'е глюк. Если делать малые размеры, то процент доставки пакета без искажений увеличивается.

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

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:19

У меня вопрос!
Программа слушает определенный порт. Таймер ежесекундно высвечивает IP на кнопке.
Command.Caption = Winsock.LocalIp
Вначале он равен 127,0,0,1, потом выхожу в инет, программа продолжает утверждать, что Ip = 127.0.0.1. Перезагружаю программу - IP меняется на сетевой. Может надо как-то обновлять winsock???

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:20

Ramauf писал(а):А вообще файлы надо перекачивать ни winsock'ом, ни internet transfer'ом, а апи-функцией FtpGetFile и FtpPutFile, они а Api-guide описаны и пример там есть специально для VB.

Бред.
Эти функции применимы только в том случае, если работает FTP-сервер.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:21

Ramauf писал(а):Может надо как-то обновлять winsock???

Нужно, но не поэтому.

И мысль всё-таки поясни.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:26

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:27

Ramauf писал(а):Winsock поделив пакеты или не успевает все кроме первого отправить, или не успевает всех кроме первого принять, либо склеить,либо клеить надо самому.

Не так. И не надо ничего клеить, этим занимается транспортный уровень.
Единственный глюк винсока (его вроде бы не исправили) -- не доходит последний пакет, если был разрыв соединения. Но это не относится к данному случаю.
Lasciate ogni speranza, voi ch'entrate.

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:30

GSerg писал(а):
Ramauf писал(а):Может надо как-то обновлять winsock???

Нужно, но не поэтому.

И мысль всё-таки поясни.



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

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

Сообщение tyomitch » 13.02.2006 (Пн) 14:31

Ramauf писал(а):Winsock поделив пакеты или не успевает все кроме первого отправить, или не успевает всех кроме первого принять, либо склеить,либо клеить надо самому.




Про LocalIP: а если у тебя на машине 10 IP-адресов, то какой должен показывать винсок в LocalIP? :-)
Изображение

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:34

alibek писал(а):
Ramauf писал(а):Winsock поделив пакеты или не успевает все кроме первого отправить, или не успевает всех кроме первого принять, либо склеить,либо клеить надо самому.

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



Факт: при посылке большого пакета (winsock.senddata str ,где str - тип string) приходит только начало, примерно 10 кБ, может у меня винсок глючит?!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:36

При посылке большого пакета он приходит фрагментами; эти фрагменты надо склеивать. Не пойму, в чем тут глюк?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:37

А может ты всё-таки не понимаешь, что всё приходящее надо накапливать в буфер? Или ты никогда не читал мануал и ожидаешь, что всё придёт в одном событии?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:37

[/quote]

Про LocalIP: а если у тебя на машине 10 IP-адресов, то какой должен показывать винсок в LocalIP? :-)[/quote]

Нет, адрес один, но происходит такая вешь.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:41

Неужели? И как ты установил, что адрес один?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:43

alibek писал(а):При посылке большого пакета он приходит фрагментами; эти фрагменты надо склеивать. Не пойму, в чем тут глюк?


Подкинь пример как сделать.

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:44

GSerg писал(а):Неужели? И как ты установил, что адрес один?


Посмотрел в состоянии подключения :oops:
Разве не так? :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:46

Ramauf писал(а):Подкинь пример как сделать.

Слабо найти на форуме?

Ramauf писал(а):Посмотрел в состоянии подключения

У меня вот в свойствах подключения один адрес. А у меня их 4. loopback, локалка1, локалка2 и внешний.
Последний раз редактировалось GSerg 13.02.2006 (Пн) 14:48, всего редактировалось 2 раз(а).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:47

Ramauf писал(а):Подкинь пример как сделать.

Что значит "как"? Как склеивать?
GlobalBuffer = GlobalBuffer & CurrentFragment
Где GlobalBuffer -- как Private на уровне модуля/класса, либо Static в DataArrival.
Можешь статью на сайте глянуть, там тоже про это есть.
Lasciate ogni speranza, voi ch'entrate.

Ramauf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 03.08.2003 (Вс) 21:10
Откуда: Кумертау

Сообщение Ramauf » 13.02.2006 (Пн) 14:53

Ну, короче, все ясно, пойду тестировать.
Спасибо всем за горячий спор!!!

Wild VB Code for Food
Постоялец
Постоялец
 
Сообщения: 387
Зарегистрирован: 16.06.2005 (Чт) 17:34
Откуда: ты, друг? =)) Сообщений: 1234

Сообщение Wild VB Code for Food » 13.02.2006 (Пн) 18:32

Ramauf
Э не легче передавать данные типами

Код: Выделить всё
Type packet
validator as integer 'индефикатор пакета,
size as long 'размер всего пакета
length as long 'размер данных
data(1024) as long 'по 4 байта
sesid as long 'нужно для индефикации пакета, что пакет пришёл правильно
End type

Function PrePacket(data() as byte, validator as string, sesid as long) as packet
Dim tmppck as packet

with tmppck
.sesid = sesid
.validator = asc(validator)
.data = data
.length = len(data)
.size = len(tmppck)
End with

PrePacket = tmppck

End function


Писал по памяти, поэтому мог упустить (упистил даже) некоторые моменты (ReDim Preserve data, и.т.п)

AiLEX
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.09.2005 (Вс) 11:44
Откуда: Котлас

Сообщение AiLEX » 13.02.2006 (Пн) 20:21

Вот еще вопрос, попробовать самому ни как руки не доходят.
Вопрос:
Посылаю большой пакет. Из-за размера он естественно делится на всяких там более низких уровнях еще на части и на клиенте срабатывает несколько dataarrival'ов. А вот на сервере SendComplete срабатывает сколько раз?
Упала вилка на пол и как начала валяться...

След.

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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 85

    TopList