Поедлитесь Winsock классами. :(

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Вот 8)

Сообщение xenomorph » 02.12.2004 (Чт) 10:17

Выдрано из проэкта 8).
Кодю как умею 8].

Это класс. Сначала спарсить инстанс сокета и :

Private Sub ws_Main_DataArrival(ByVal bytesTotal As Long)
Call cls_PD.DataArrival
End Sub

Работает специально для отделения пакетов ...

ИМХО
>ты совершенно прав. нелья надеяться на то, как винсок разобьет >пакеты. лучше делать это вручную: создать свой буффер, и посылать >файл по пакетам размером примерно 2-4 кб.

v-adix совершеннон не прав. Но лень чепятать 8)

'==================================
' =X=
'==================================
' Packet Deployment Module
'==================================
'Requied Files:
'MSWinsock
'==================================

Option Explicit

Dim ws_Main As Winsock
Dim s_MainBuf As String

Private Const l_PHSize = 10 'Packet Header Size

Public Event GotPacket(s_PData As String)

'Parcing Instance
Public Sub Inst(ByRef ws_Socket As Winsock)

Set ws_Main = ws_Socket

End Sub

'Getting Data
Public Sub DataArrival()

Dim l_PSize As Long
Dim s_Output As String

ws_Main.PeekData s_MainBuf

Start:

'Exiting if it is less than a header size
If Len(s_MainBuf) < l_PHSize Then Exit Sub

'Getting Packet Size out of the Header
l_PSize = CLng(Trim(Left(s_MainBuf, l_PHSize)))

Select Case Len(s_MainBuf)

Case Is >= l_PSize 'Packet is less than Data in Buffer

'Getting Packet Data
s_Output = Mid(s_MainBuf, l_PHSize + 1, l_PSize - l_PHSize)

'Clearing Data in Main Buffer
s_MainBuf = Right(s_MainBuf, Len(s_MainBuf) - l_PSize) ' 'Mid(s_MainBuf, l_PSize, Len(s_MainBuf) - l_PSize)
'If Len(s_MainBuf) - l_PSize = 0 Then s_MainBuf = ""
Dim s_Void As String
ws_Main.GetData s_Void
s_Void = ""


'Parcing Data
RaiseEvent GotPacket(s_Output)

'Recursing
GoTo Start

Case Is > l_PSize

Exit Sub 'Waiting for the rest of the Packet

End Select

End Sub

'Sending Data
Public Sub SendData(s_Data As String)

Select Case GD.b_UseCrypto

Case Is = False

ws_Main.SendData Left(Trim(Str(Len(s_Data)) + 10) & " ", 10) & s_Data

Case Is = True

Dim X As New cls_RC4

'Crypting
s_Data = X.EncryptString(s_Data, GD.s_SessionCK, False)
s_Data = "CRTD_" & s_Data

ws_Main.SendData Left(Trim(Str(Len(s_Data)) + 10) & " ", 10) & s_Data

End Select

End Sub

'Error
Public Sub OnError()

s_MainBuf = ""
ws_Main.Close

End Sub
'=================================
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 02.12.2004 (Чт) 15:27

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

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 02.12.2004 (Чт) 15:30

2 xenomorph
сейчас пробежался по твоему постингу... объясни что это вообще за код, для чего он нужен, и что такое "спарсить инстанс сокета"?
v-adix совершеннон не прав. Но лень чепятать

Начепятай :D пожалуйста в чем я не прав?

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 02.12.2004 (Чт) 19:20

> сейчас пробежался по твоему постингу...

Это радует 8)))

> объясни что
> это вообще за код,

Это класс который "присобачивает" и "отсобачивает" заголовок
к пакету ... Его смысл - в нём есть ивент прихода 1 пакета.

мы ему данные и сокет, а он к ним привязывает заголовок
и отправляет. Он же данные принимает, отрезает заголовки,
генерит ивент если пришёл пакет. В аттаче - полностью пример
сервера и клиента.

Вообщем это ТО о чём все тут говорили 8)

> для чего он нужен, и что такое
> "спарсить инстанс сокета"?

- передать инстанс сокета в инстанс класса, чтобы тот
на него мог сослаться 8) когда надо.

Каждый раз переделывать класс? - если новый сокет\форма?
- так проще и удобнее. Если не понятно - забудь! 8)

ИМХО в чём ты не прав:
1. " создать свой буффер, и посылать файл по пакетам размером примерно 2-4 кб."
2.
>>'=====================
>>sub waitfornext()
>>wt=false
>>while wt=false
>>doevents
>>wend
>>end sub
'=====================

ИМХО плохо - это луповый вариант. Некрасиво - переделай на событийный!
Вложения
Packet Deployment.rar
(3.11 Кб) Скачиваний: 18
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

EvilCoder
Посланец джихада
Посланец джихада
Аватара пользователя
 
Сообщения: 706
Зарегистрирован: 25.01.2004 (Вс) 15:08

Сообщение EvilCoder » 02.12.2004 (Чт) 20:17

DELETED :evil: :arrow: 8)
Последний раз редактировалось EvilCoder 15.07.2009 (Ср) 13:30, всего редактировалось 1 раз.
<<------- EvilCoder ------->>

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 04.12.2004 (Сб) 19:56

xenomorph писал(а):> сейчас пробежался по твоему постингу...

Это радует 8)))

> объясни что
> это вообще за код,

Это класс который "присобачивает" и "отсобачивает" заголовок
к пакету ... Его смысл - в нём есть ивент прихода 1 пакета.

мы ему данные и сокет, а он к ним привязывает заголовок
и отправляет. Он же данные принимает, отрезает заголовки,
генерит ивент если пришёл пакет. В аттаче - полностью пример
сервера и клиента.

Вообщем это ТО о чём все тут говорили 8)

> для чего он нужен, и что такое
> "спарсить инстанс сокета"?

- передать инстанс сокета в инстанс класса, чтобы тот
на него мог сослаться 8) когда надо.

Каждый раз переделывать класс? - если новый сокет\форма?
- так проще и удобнее. Если не понятно - забудь! 8)

ИМХО в чём ты не прав:
1. " создать свой буффер, и посылать файл по пакетам размером примерно 2-4 кб."
2.
>>'=====================
>>sub waitfornext()
>>wt=false
>>while wt=false
>>doevents
>>wend
>>end sub
'=====================

ИМХО плохо - это луповый вариант. Некрасиво - переделай на событийный!

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

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Reply

Сообщение xenomorph » 05.12.2004 (Вс) 9:48

Уважаемый, V-adix! Я бы на Вашем месте оооочень внимательно
анализировал чужой код, перед тем как его интерпретировать и давать оценку.

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

Чуть-чуть не так 8) или можно сказать принципиально не так! 8)
Он сравнивает длинну пакета в первом заголовоке и длинну всего пакета.
И если длинна достигнута - откусывает первый пакет и переходит ко второму.
Хотю подчеркнуть, что второй заголовок НЕ анализируеться, до того как ВЕСЬ
первый пакет выявлен. (а выявляеться он по длинне - в первом заголовке)
Что автоматически исключает возможность
приведённую Вами в качестве недостатка 8):

>> "которая повторяет заголовок "якобы существующих" пакетов"

Механизм работы класса такой:

1. Приходит хэдэр. Из него выдираеться размер всего трансфера.
2. Данные аккумулируються.
3. Пакет заканчиваеться _НЕ_ когда ещё один хэдэр пришёл,
и анализ на второй хэдэр НЕ проводиться, а анализируеться длинна
всего пакета ... 8).

Вероятность сбоя при анализе _математически_ равна _нулю_.

Ограничения:

Единственное ограничение - по размеру РАМ.

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

Я с этим абсолютно согласен ;)
И что в этом плохого? ;)
- мой класс занимаеться формированием и разбивкой такого
следствия работы винсока.

Н.Б. 25 метровй видео ролик,
РАР архив в 15 метров,
- всё дошло ;)

У твоего метода есть одно огромное достоинство - он прост ;)
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Re: Reply

Сообщение v-adix » 05.12.2004 (Вс) 18:22

xenomorph писал(а):Я с этим абсолютно согласен ;)
И что в этом плохого? ;)
- мой класс занимаеться формированием и разбивкой такого
следствия работы винсока.

ну-ну! это не такое следствие работы винсока, а такое следствие отправки пакетов! ты пользуешься методом SendData подряд несколько раз, и сам создаешь себе проблемы!
и вообще какая разница какой метод использовать? ты используй свой, а я буду свой... но всетаки, мне не понятно зачем использовать какой-то выдранный неизвестно откуда класс, для того чтобы непонятно каким образом разделять склеившиеся пакеты! и что эо дает? а только и всего-то, что возможность подряд писать метод senddata! плюс, приходится перестраивать событие DataArrival и т.д.

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

Сообщение tyomitch » 05.12.2004 (Вс) 19:01

v-adix писал(а):нелья надеяться на то, как винсок разобьет пакеты. лучше делать это вручную: создать свой буффер, и посылать файл по пакетам размером примерно 2-4 кб.

Не угадаешь - по дороге где-нибудь будет стоять кривой роутер, который режет пакеты на 1Кб-куски.
Зачем вообще заморачиваться с пакетами? Почему нельзя посылать перед файлом длину, а в _DataArrival только проверять - всё пришло или ещё нет? TCP создан для того, чтобы абстрагироваться от пакетов, а вы зачем-то их вновь задействуете...
Посмотрите, действительно, на FTP! После досылки файла соединение рвётся. Идеальная, надёжная синхронизация. Зачем изобретать уже существующие вещи?

2xenomorph: сорри, сначала написал, потом прочитал твои многостраничные посты... Код не смотрел, но судя по описанию всё именно так, как и должно быть :-)
Изображение

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 05.12.2004 (Вс) 19:35

tyomitch писал(а):
v-adix писал(а):нелья надеяться на то, как винсок разобьет пакеты. лучше делать это вручную: создать свой буффер, и посылать файл по пакетам размером примерно 2-4 кб.

Не угадаешь - по дороге где-нибудь будет стоять кривой роутер, который режет пакеты на 1Кб-куски.
Зачем вообще заморачиваться с пакетами? Почему нельзя посылать перед файлом длину, а в _DataArrival только проверять - всё пришло или ещё нет? TCP создан для того, чтобы абстрагироваться от пакетов, а вы зачем-то их вновь задействуете...
Посмотрите, действительно, на FTP! После досылки файла соединение рвётся. Идеальная, надёжная синхронизация. Зачем изобретать уже существующие вещи?

2xenomorph: сорри, сначала написал, потом прочитал твои многостраничные посты... Код не смотрел, но судя по описанию всё именно так, как и должно быть :-)

приведи пример кода, посылающий файл размером 300-400 мб твоим методом :)

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

Сообщение GSerg » 05.12.2004 (Вс) 19:50

А где мотивация?
Ты ему свой IP дай, и порт скажи какой открыт... Вот это будет мотивация... :)
А уж если признаешься, сколько за метр входящего платишь, ну тут вообще... :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 05.12.2004 (Вс) 20:30

>> ну-ну! это не такое следствие работы винсока, а такое следствие
>> отправки пакетов! ты пользуешься методом SendData подряд ...

И чисто теоретически винсок должен был бы их отправлять отдельными
порциями и генерить два ивента прихода данных ...
ИМХО тот факт что я использовал SendData два раза подряд,
а ивент один (обычного винсока - "склееная строка") мои слова отнюдь не опровергает,
а подтверждает 8). ... + мнения выше на форуме 8)

>> ... несколько раз, и сам создаешь себе проблемы!

Здесь внесу ясность - я довольно долго и очень по разному 8)
занимаюсь сетевым кодингом. И ооочень часто возникает такая ситуация -
при диалоговом режиме - облен маленькими коммандами (маленькими
порциями данных - между клиентом и сервером - в рез-те которой:

Идет "диалог" с дополнениями - когда дополнительные данные отсыла-
ються сервером клиенту опосля основных и наоборот ...

1. клиент -> запрос -> сервер
2. клиент <- ответ <- сервер
3. клиент <- ответ <- сервер

Именно в таких (и специально для таких случаев!) написан даный класс.

>> и вообще какая разница какой метод использовать? ...

В принципе это _каждый решает сам_ 8). Я просто аргументирую свою
точку зрения to my the extend of my knowlage and abilities 8).
Возможно кто-нить ещё посчитает её более оптимальной *)

>> ты используй свой, а я буду свой... но всетаки, мне не понятно
>> зачем использовать какой-то выдранный неизвестно откуда класс,

8)
Пункт а)
Из _интересТного_ прожекта 8).
Пункт б)
Штото мене подсказывает что это не аргумент ... 8), а "неезд" скорее 8) (шутю 8)))

>> для того чтобы непонятно каким образом ...

8) см. пункт (б)

>> разделять склеившиеся
>> пакеты! и что эо дает? а только и всего-то, что возможность
>> подряд писать метод senddata! плюс, приходится перестраивать
>> событие DataArrival и т.д.

8) No Comments ...
Хотя ...

Просто если возникнет необходимость в качественом, быстром, зашифрованом,
инкапсулированом модуле\классе для обработки пересылки\приёма данных ...
я думаю мой вариант способен подталкнуть заинтересованого человека в
правильном направлении, или хотя бы, - показать один из возможных вариантов
написания своего 8).

Н.Б. Я могу ошибаться, но, мне кажеться, что Tyomitch моё мнениЁ частично
разделяет 8)))

2 Tyomitch:

>> Зачем вообще заморачиваться с пакетами? Почему нельзя посылать перед файлом
>> длину, а в _DataArrival только проверять - всё пришло или ещё нет?

Это именно то, что мой класс делает 8))).

>> TCP создан для того, чтобы абстрагироваться от пакетов, а вы зачем-то их вновь задействуете...
>> Посмотрите, действительно, на FTP! После досылки файла соединение рвётся. Идеальная,
>> надёжная синхронизация. Зачем изобретать уже существующие вещи?

Ну ... это 95% ДА для большинства случаев ...
У меня спецификация необычная 8). Я не программер, кодинг - для меня метод
решения практ. задачь 8) не более того ...

Так вот - один _лишний_ коннект (после обрыва связи) - есть + 1 лог входящего
или исходящего соединения - т.е. запись в журнале ...
После некоторого критического N - зависит от
наблюдательности \ параноидальности администратора это вызывает некоторые
проблемы 8). Количество соединений в логе - есть величена критическая.

№2 Это то что иногда, существует всего лишь одна уникальная возможность
коннекта вовнурь \ наружу ... что автоматически ставит крест на
возможности ипользования импульсного (коннект \ обрыв) соединения ...

Думаю я достаточно ясно изложил своё мнение по этому вопросу.
(я не говорю что оно правильное 8)
... но ИМХО дальнейшая дискуссия is going to a deadlock и персоналиям 8(.
2 v-adix:
Спасибо за ту чать беседы - которую я посчитал аргументированой! 8)
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

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

Сообщение tyomitch » 06.12.2004 (Пн) 0:28

xenomorph писал(а):>> Зачем вообще заморачиваться с пакетами? Почему нельзя посылать перед файлом
>> длину, а в _DataArrival только проверять - всё пришло или ещё нет?
Это именно то, что мой класс делает 8))).

Ну, тогда всё правильно :-)

Я, когда писал похожую прогу, делал именно с маркерами "граница файла" и хитро преобразовывал сами файлы, чтобы внутри них такой маркер не мог встретиться. Удивительно, но работало :-) Сейчас бы, конечно, сделал именно так, как у тебя - с длиной в заголовке.

А метод с обрывом соединения после досылки, действительно, в VB применим лишь ограниченно: из-за бага в Винсоке последние переданные данные при этом могут не доходить до клиента :-(
Изображение

Пред.

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

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

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

    TopList