Массив из winsock'ов, а порт почему-то у всех один - глюк?

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

Массив из winsock'ов, а порт почему-то у всех один - глюк?

Сообщение GRS » 18.10.2007 (Чт) 16:18

Приветствую. :wink:

Пишу болталку, на winsock'е, не больше 25 человек, серверный модуль + клиентские.
Размещаю на форме один winsock и присваиваю ему индекс 0. Объявляю глобальную переменную NEXT_INDEX, в которой будет индекс следующего winsock'а в массиве. Короче, стандартно...
Если у самого первого, с индексом 0, возникает событие Request, то NEXT_INDEX увеличивается. Теперь весчь, которую я не могу понять.
События развиваются так:

Код: Выделить всё
Dim NewPort As Long
 
  Load wskCLIENT(NEXT_INDEX)
  NewPort = 50000 + NEXT_INDEX
  wskCLIENT(NEXT_INDEX).LocalPort = NewPort
  wskCLIENT(NEXT_INDEX).Accept requestID


До тех пор, пока не выполняется последняя комманда у вновь созданного wskCLIENT значение LocalPort именно такое, какое я и жду. Дело в том, что wskCLIENT(0), тот что обрабатывает изначально все запросы клиентов на соединения имеет свойство LocalPort = 50000.
Далее я себе это видел так: новый wskCLIENT() - значит ему присваиваем новый LocalPort куда перенаправим наш запрос на соединение. Чтобы не мудрить я и прибавляю к 50000 NEXT_INDEX. Фактически, как я полагал, должно было получиться так:
wskCLIENT(0) - у него LOCAL PORT = 50000,
wskCLIENT(n) - у него LOCAL PORT = 50000+n.


А на деле у всех после выполнения последней команды значение LocalPort = 50000, хоть тресни. Из-за чего это? Почему соединение все равно происходит по установленному для 0-вого контрола порту? Что это за наследование такое?...
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение alibek » 18.10.2007 (Чт) 16:45

А зачем привязываться к номеру порта? Делай LocalPort=0, тогда будет выбран первый свободный. Кроме того, обнуление порта избавит от глюков, когда порт не освобождается.
Lasciate ogni speranza, voi ch'entrate.

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.10.2007 (Пт) 10:44

Приветствую :wink:
alibek, можно сказать, что сработал на опережение и ответил на мой вопрос, который я хотел дописать, уже после того как создал тему. Но какие-то глюки связи...

В общем, да, я вижу решение это именно так. Было бы лучше. Но все-таки, моя вопрос остался открытый. Из-за чего это происходит?
Имеенно с массивом, потому что если контролы не объеденены в массив - все так, как я и ожидаю: если порт занят - он, млин :wink: , занят и никаких гвоздей.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение SSecurity » 19.10.2007 (Пт) 21:38

Привет,

Я не притендую на совершенство алгоритма, но у меня так:

Слушаю порт 50000
При Request, перебарю все Винсоки которые создавал ... если они есть те, которые уже отрубились - выбираю их для дальнейшей работы, если нет свободных - создаю винсок на подобии винсока(0) ... закрываю его ... и принимаю Запрос к новому (либо строму свободному сокету) ... после этого работаю спокойно не замарачиваясь :)

В твоем же случае можно насаздавать тысячи винсоков, а полезных рабочих будет 5 :)

+ не факт что тот порт который ты назначаешь в данный момент свободен ....
+ я всегда на всякий случай загрываю сокет а потом "аспектю" рекваест :))

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

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 20.10.2007 (Сб) 7:12

SSecurity
Я не выкладывал полный код, но - не будет у меня winsock'ов более 25. Это заложено изначально в программе.

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

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

Сообщение SSecurity » 20.10.2007 (Сб) 12:46

GRS а если я 25 раз приконнекчусь к тебе на 50000 порт и позакрываю сокеты у тебя больше никто не подключится? :)

Наверно да :))

Ну .... как ответ на твой вопрос ... очевидно когда ты принимаешь запрос ... ты соглашаешься с тем, что принимаешь его на 50000 порт :)
А вот если бы ты например ... создавал новый винсок, открывал новый порт .... включал прослушку, а с 50000 порта примал запрос и передавал например номер порта куда надо приконнектится, типа так:

Код: Выделить всё
CNTO 1.1.1.1:50001


а в клиенте трактовал этот запрос как
"разорвать соединение и приконнектиться к указанному адресу", то
будет тебе счастье :)
(это как в аське авторизация)

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


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

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

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

    TopList