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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

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

Сообщение ALX_2002 » 26.11.2004 (Пт) 16:42

Народ, у кого есть класс модули винсока, поделитесь плззз ? :(

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

Сообщение tyomitch » 26.11.2004 (Пт) 16:44

Ну например http://www.vbip.com/winsock-api/csocket ... ass-01.asp ...
Гугл тебе в помощь :-)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.11.2004 (Пт) 16:53

2 tyomitch: Паасиба !!! По ходу, то что я искал :shock: :D , только я видать запрос в поисковик неправильно давал - "winsock class" :oops:

Позор мне :!:

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

Сообщение EvilCoder » 26.11.2004 (Пт) 17:23

:arrow: :arrow: <DELETED> :twisted: 8)
Последний раз редактировалось EvilCoder 14.08.2008 (Чт) 1:55, всего редактировалось 1 раз.
<<------- EvilCoder ------->>

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

Сообщение tyomitch » 26.11.2004 (Пт) 17:50

EvilCoder, если твоё приложение чувствительно к разбивке приходящих/уходящих данных по пакетам - значит, оно криво написано :-)
Нормально написанный сервер должен по одному только потоку данных определять, где файл, а где команда; опираться на разбивку на пакеты очень ненадёжно.
Изображение

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 26.11.2004 (Пт) 21:32

ээээ ... EvilCoder, а я вот Гигабайты с одного локального диска на другой через винсок слал (в тесте дурью маялся:)) ни байта ни потерял и всё переслалось :) ... всего vbCrLf или vbCr в конце команды:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

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

Сообщение EvilCoder » 27.11.2004 (Сб) 16:08

:arrow: :arrow: <DELETED> :twisted: 8)
Последний раз редактировалось EvilCoder 14.08.2008 (Чт) 1:55, всего редактировалось 1 раз.
<<------- EvilCoder ------->>

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.11.2004 (Сб) 17:28

Слать файлы на один порт, а данные - на другой? :wink:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

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

Сообщение tyomitch » 27.11.2004 (Сб) 19:53

EvilCoder, вместе с заголовком "%FILE%" шли длину файла - и не будет никаких проблем.
Изображение

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 27.11.2004 (Сб) 21:49

мой ответ прост как как два пальца об бетон, каждая команда должна заканчиваться определенной комбинацией символов я делаю например так:

RF blablabla<RB> + vbCr

RF - команда примитивная - читать файл (всегда пишется вначале, потому как у меня программируется чтение одной команды тип которой всегда вначале - "буферное накопление")
<RB> - команда, после которой данные между RF и <RB> читается.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 27.11.2004 (Сб) 21:50

а вообще если не нравится - шли подтверждение на прем команд:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

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

Сообщение EvilCoder » 28.11.2004 (Вс) 1:30

:arrow: :arrow: <DELETED> :twisted: 8)
Последний раз редактировалось EvilCoder 14.08.2008 (Чт) 1:55, всего редактировалось 1 раз.
<<------- EvilCoder ------->>

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 28.11.2004 (Вс) 1:48

В правильном направлении следуете, товарищ (c) :lol:
CreateThread и прирост будет, а ты думаешь для чего тогда тулзы пишут навроде Reget'а?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

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

Сообщение tyomitch » 28.11.2004 (Вс) 10:38

xolod, прироста не будет :-D
А регеты качают из многих источников сразу - оттуда и прирост.
Изображение

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

Сообщение tyomitch » 28.11.2004 (Вс) 10:43

EvilCoder писал(а):
xolod писал(а):Слать файлы на один порт, а данные - на другой?

Вот-вот... давно подумывал :P . наверное так и сделаю :)

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

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

Сообщение EvilCoder » 28.11.2004 (Вс) 12:33

:arrow: :arrow: <DELETED> :twisted: 8)
Последний раз редактировалось EvilCoder 14.08.2008 (Чт) 1:53, всего редактировалось 1 раз.
<<------- EvilCoder ------->>

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

Сообщение tyomitch » 28.11.2004 (Вс) 13:29

Самый простой вариант - рвать связь после конца передачи файла. Простая и надёжная синхронизация.
Дописывать в заголовок "потока" длину файла тоже просто и эффективно.
Вот, уже два способа есть :-)
Изображение

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 29.11.2004 (Пн) 16:14

А почему бы не посылать в пакете имя файла, размер пакета и позицию в файле куда это писать, вроде:

PACK|FILE|file.txt|512|2048|.Данные.....

И не нужно париться с синхронизацией.
Программисты не глючат - глючат компиляторы...

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

Сообщение tyomitch » 29.11.2004 (Пн) 17:46

CodeName33, новый TCP писать предлагаешь? :-)
Так он уже написан ;-)


И в твоём случае - вместо синхронизации будут запары со сборкой, на стороне клиента.
Изображение

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 29.11.2004 (Пн) 21:04

В чем вообще суть проблемы?
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

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

Сообщение tyomitch » 29.11.2004 (Пн) 21:09

Пересылать файлы, много подряд, и не путать где какой.
EvilCoder, так?
Изображение

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

Сообщение EvilCoder » 29.11.2004 (Пн) 21:30

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

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 29.11.2004 (Пн) 22:52

А если много подряд, почему нельзя сделать так .... шлем поток данных "МНОГо-МНОГО-МНОГО" а потом ... шлем заголовки все:)
А лучше наоборот, тогда у нас сраз сформируется цепочка заголовков, принимая данные мы сразу сможем отрезать всё что нам нужно и сохранять в качестве файла.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 30.11.2004 (Вт) 10:27

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

Какие запары со сборкой на другой стороне?
Собирается всё, что приходит в одну строку. Дальше просмотратривается заголовок-пакета. Если есть целый пакет, он вырезается из общеё кучи в отдельную строку и уже анализируется. Split по разтелителю | и все параметры в массиве. Находится имя файла и пишется в указанное место указанное количество байт. Куда и чего писать передаётся с удалённой машины (хоть пакет с началом файла, а за ним конец файла) и серверу этим парится не нужно он пишет куда сказано (и докачку легко сделать).
Программисты не глючат - глючат компиляторы...

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

Сообщение alibek » 30.11.2004 (Вт) 10:56

Согласен, если правильно продумать, никаких проблем со сборкой не будет.
Только все-же зачем изобретать надстройку над TCP, которая делает тоже самое?
Lasciate ogni speranza, voi ch'entrate.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 30.11.2004 (Вт) 11:46

alibek, а зачем с 2 винсоками и синхронизацией парится?
Программисты не глючат - глючат компиляторы...

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

Сообщение alibek » 30.11.2004 (Вт) 12:00

Использование двух сокетов, когда достаточно одного - признак кривого дизайна, поэтому на этот вопрос ничего не отвечу.
А проблем с синхронизацией не вижу. Если синхронизация при скачивании одного файла в несколько потоков - можно поступать, как FlashGet. Т.е. создается пустой файл требуемой длины, а информационные блоки сразу пишутся на свое место.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение v-adix » 30.11.2004 (Вт) 12:21

tyomitch писал(а):EvilCoder, если твоё приложение чувствительно к разбивке приходящих/уходящих данных по пакетам - значит, оно криво написано :-)
Нормально написанный сервер должен по одному только потоку данных определять, где файл, а где команда; опираться на разбивку на пакеты очень ненадёжно.

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

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 30.11.2004 (Вт) 12:21

" Всякое изобретение колеса всегда приводит к появлению костыля из серии Смотрите ребята что я налабал ":
ктото из "великих"


Наверное стоит посмотреть как работает FTP в pass и active :wink

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

Сообщение v-adix » 30.11.2004 (Вт) 12:36

EvilCoder писал(а):а шо? как делать то? :?

Значит так:
Клиент отсылает файл.
Socket.SendData "%END%" & BinnaryFileString & "%FILE%"

Сервер принемает.
Socket.GetData StrDATA
If Right$(strDATA,6)="%FILE%" Then DownLoadFile ()

А вот иногда.(если перед файлом Команду отправить) она их склеивает, ну дальше понятно - ОБЛОМ.
Вот скажите.. как можно, проще?
Можно:
Подтверждать полученную команду (облом в скорости - НЕ ПОДХОДИТ)
Искать комманды во всех входящих данных (Split перебором :) - ТОЖЕ...)
Я идиот! Убейте меня, кто-нибудь!


Ничего подобного! Винсок склеивает две команды, еcли ты их запишешь так (причем не "иногда", а ВСЕГДА):

w.senddata "123"
w.senddata "456"

тогда на сервере произойдет вот что: событие DataArrival вызовется ОДИН раз, и написав w.GetData на сервере ты получишь строку: "123456". А вот попробуй сделать так:

Код: Выделить всё
Option Explicit
dim wt as boolean

sub SendSomething(cmd1 as string, cmd2 as string)
winsock1.senddata cmd1
waitfornext
winsock1.senddata cmd2
end sub

Private Sub Winsock1_SendComplete()
wt = True
End Sub

sub waitfornext()
wt=false
while wt=false
doevents
wend
end sub


тогда на сервере событие DataArrival произойдет 2 раза. Один раз ты получишь "123", а второй раз, "456" - событие SendComplete вызывается когда пакет УЖЕ ОТОСЛАН, и винсок готов отослать следующий пакет. А когда ты посылаешь 2 пакета так:
w.senddata "123"
w.senddata "456"
то винсок это воспринимает это как w.senddata "123456". причем это не глюк. а чтобы посылать данные, разбивая их на пакеты вручную, можно использовать событие SendComplete. Итак, для пересылки файла нужно:
1. Разбить его на пакеты по 2-4 кб
2. Отсылать пакет за пакетом таким образом:
Код: Выделить всё
dim packets() as string
'код для разбивки файла на пакеты и загрузка пакетов в массив packets
for x = 1 to ubound(packets)
winsock1.senddata packets(x)
waitfornext
next x

3. Когда файл отослан:
Код: Выделить всё
...
next x
'цикл отсылки файла завершился
waitfornext
winsock1.senddata "команда1 после отсылки файла"
waitfornext
winsock1.senddata "команда2 после отсылки файла"

Используя этот алгоритм можно организовать и докачку файлов при обрыве соединения.

След.

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

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

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

    TopList  
cron