winsock

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

winsock

Сообщение Armageddon » 27.10.2004 (Ср) 11:05

заметил непрятную особенность winsock`а

если делать отправку данных в цикле, вида

For a = 1 To 2
Winsock1(a).SendData "данные" & vbCrLf
Next

то с winsock1(2) данные нормально уходят, а у winsock1(1) они где то в буфере остаются, до тех пор пока на него отдельно данные не подать, потом они уходят из него стопкой. можно ли какнибудь обойти этот косяк?

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

Сообщение alibek » 27.10.2004 (Ср) 12:07

Это не косяк, это фича.
Lasciate ogni speranza, voi ch'entrate.

Armageddon
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 15.11.2002 (Пт) 15:16

Сообщение Armageddon » 27.10.2004 (Ср) 13:00

alibek писал(а):Это не косяк, это фича.

да да, как её пофиксить?

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

Сообщение GSerg » 27.10.2004 (Ср) 13:53

Что значит как? Фичи не фиксятся :)
Там же буфер у винсока ессь, он его заполнит - отошлёт...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Max22
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.08.2003 (Вт) 17:57
Откуда: Уфа

Сообщение Max22 » 27.10.2004 (Ср) 19:06

Да да, есть такой косяк, как побороть?
Сервер получает данные от клиента, и отсылает их другим клиентам:

Код: Выделить всё
Private Sub tcp_DataArrival(Index As Integer, ByVal bytesTotal As Long)

    Dim txt As String
    Dim f as Integer
    tcp(Index).GetData txt
        For f = 1 To TCPclient
            If f <> Index Then frmTTY.tcp(f).SendData txt
        Next
Exit Sub

Получить должны ВСЕ остальные клиенты. А получают один иль два... Как быть?

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

Сообщение SSecurity » 30.10.2004 (Сб) 20:11

Чую я что кто-то тут чат делает:)

Пусть у тебя клиенты проверочные байты периодически шлют :) на свой отдельный винсок :) (о котором им твой же сервак при коннекте и расскажет :))

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

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.10.2004 (Сб) 22:32

Ага, keep-alive называется. А вообще, был тут где-то топик, где автор тоже пытался избавиться от этой ненавязчивой буферизации :) . Правда, там он оперировал непосредственно API...

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

Сообщение SSecurity » 30.10.2004 (Сб) 23:17

Я на винсоке сделал прогу типа Виндовс Командер .... тока коннектится к клиенту а все остальные операции выполняются как в обычном режиме ....
можно лить файлы, заливать, менять .... а можно и с юзером поговорить у которого клиент стоит :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Max22
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.08.2003 (Вт) 17:57
Откуда: Уфа

Сообщение Max22 » 02.11.2004 (Вт) 0:50

Самое интересное, дома на XP всё отлично работает. А на работе на 2000-ном глючит. Возможно из-за того, что дома sp5 на VB стоял... Но проверить щас не могу, на работе винт очень сильно сдох... :(

Max22
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.08.2003 (Вт) 17:57
Откуда: Уфа

Сообщение Max22 » 02.11.2004 (Вт) 18:45

Точно! Всё дело в SP5!!!

Freeman
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 02.11.2004 (Вт) 19:13
Откуда: республика Марий Эл

Сообщение Freeman » 02.11.2004 (Вт) 19:19

to SSecurity:
а можно по точнее про то как файлы заливать? :?:

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

Сообщение SSecurity » 02.11.2004 (Вт) 22:56

делаешь команды:)

например, шлем данные клиенту

"GF [данные][RB]"
клиентская прога: Смотрит,
GF - значит то что нам послали - это файл, \
[RB] - я всегда юзаю чтобы подтвердить что строка данных заончилась (он хоть по 1 байту шлет, хоть по сто ... всеравно команда не выполнится пока последние 4 байта не равны[RB])
вся строка пишется в временный стринговый буфер, после выполнения команды, буфер чистится.

По первым трем байтам получаем команду:)
можно структуру "данных" разложить как

[название][разделитель][строка данных]

пример
GF autoexec.but|mini prikol from file[RB]

тут данные:
autoexec.but|mini prikol from file

autoexec.but - название
| - разделитель
mini prikol from file - содержание файла

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

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

Сообщение SSecurity » 02.11.2004 (Вт) 23:02

Вот принтскрин:

Изображение
http://www.aaa-rostov.narod.ru/0101.jpg
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Freeman
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 02.11.2004 (Вт) 19:13
Откуда: республика Марий Эл

Сообщение Freeman » 03.11.2004 (Ср) 13:14

Спасиба.. вроде работает
Истина где-то в битах

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

Сообщение SSecurity » 03.11.2004 (Ср) 21:42

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

Freeman
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 02.11.2004 (Вт) 19:13
Откуда: республика Марий Эл

Сообщение Freeman » 04.11.2004 (Чт) 17:40

у меня ещё вопрос - как просматривать содержимое винта юзера у которго стоит прога клиент?
Истина где-то в битах

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

Сообщение SSecurity » 04.11.2004 (Чт) 21:32

Это самое простое ... на клиенте ставишь Dir1 и File1:)

1. С сервера шлешь запрос на клиент с путем например:

GD c:\windows\system[RB]

Клиент у тебя из этой строки вырезает только нужный путь ("c:\windows\system").

2. Клиент говорит
Dir1.Path = "c:\windows\system"
File1.Path = "c:\windows\system"
3. Содержимое (папки и файлы) формируются в одну стринговую переменную например такого формата:

| - разделитель, так как ето запрещенный символ, можно системные символы юзать.

|:[папка1]|:...|:[папкаN]|[файл1]|...|[файлM]|

пример:
|:Windows|:MyDocuments|:Program Files|Autoexec.bat|Config.sys|Command.com|

ВНИМАНИЕ!
Тут ты передаешь папки и файлы, чтобы их различать у папок вначале стоит ДВОЕТОЧИЕ - тоже запреженный символ.

передаешь только относительный путь а не абсолютные, т.е.

:System вместо :C:\Windows\System

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


4. Шлем на сервер сформированную строку отвечая серверу тем же сочетанием букв.

GD [строка данных][RB]

5. Сервер разбирает строку и показывает всё что хочешь. Можно юзать ListView для наглядности:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Armageddon
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 15.11.2002 (Пт) 15:16

Сообщение Armageddon » 01.01.2005 (Сб) 18:31

Max22 писал(а):Точно! Всё дело в SP5!!!

у меня XP с SP1, все равно глюк, на 2003 Server тоже:(

Tradix
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 26.02.2005 (Сб) 19:39

Сообщение Tradix » 14.04.2005 (Чт) 19:44

Плзз помогите у меня такаяже фигня ПОМОГИТЕ!!!!!!!!!!!!!!! :( :( :(

Tradix
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 26.02.2005 (Сб) 19:39

Сообщение Tradix » 17.04.2005 (Вс) 22:34

Можно поподробней что где чем заменить *??

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 17.04.2005 (Вс) 23:05

У меня была та же проблема - решил ее следующем образом:
отправлял следующую порцию данных по сабобытию SendComplete!
P.S.
А на C++Builder'е винсок себе такого не позволяет :wink:


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

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

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

    TopList