подключение к серверному winsock контролу с неск. клиентов

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

подключение к серверному winsock контролу с неск. клиентов

Сообщение dklmn » 16.05.2005 (Пн) 14:31

Народ, помогите внести понимание в работу с винско контролом.
Во -первых,
допустим у меня открыт серверный сокет и к нему присоединяются клиенты. Если клиентов несколько то как происходит работа.
Да , конечно статью из MSDN я читал
- вот ее перевод
http://www.codenet.ru/progr/vbasic/winsock.php
Там рекомендуется создать массив сокетов.
Но, вот кусок кода - выполняется при запросе на соединение
'******
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub
'*******
Почему LocalPort нулевой? На какой порт мне посылать данные с клиентов? На тот же что прописан для сокета с нулевым индексом в массиве?
*****
Во -вторых,
у меня клиент после заврешения сеанса связи посылает сигнал который сначал загружает серверный сокет потом сново переводит его в состояние "прослушки".
А если у меня происходит посреди сеанса обрыв связи?
Этот сокет так и будет висеть открытым? Тогда может надо как то закрывать их по таймауту?
****
понимаю что на все эти вопросы можно получить ответ путем эксперимента, но не хочется изобретать велосипед.
Спасибо.

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

еще вдогонку вопрос

Сообщение dklmn » 16.05.2005 (Пн) 14:38

Еще вопрос про массив сокетов
Я правильно понимаю,
- при каждом запросе на соединение к массиву сокетов добавляется еще один
- и что , они будут плодиться до перезагрузки?
Если да то что с этим делать (если надо вообще делать)
Если нет то я чего то недопонимаю объясните пожалуйста в какой момент эти сокеты удаляются?

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

Сообщение alibek » 16.05.2005 (Пн) 14:43

Есть обычный сокет, а есть Listen-сокет. Тебя какой интересует?
Lasciate ogni speranza, voi ch'entrate.

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

ну серверный , то есть Listen если я что то не недопонимаю.

Сообщение dklmn » 16.05.2005 (Пн) 15:04

alibek писал(а):Есть обычный сокет, а есть Listen-сокет. Тебя какой интересует?

ну серверный , то есть Listen если я что то не недопонимаю.

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

Сообщение alibek » 16.05.2005 (Пн) 15:07

Серверный не соединяется с клиентом.
Серверный принимает запросы на соединение. Когда такой запрос поступает, он добавляет в массив сокетов новый элемент и присоединяет запрос к нему, а сам слушает дальше.
Созданный сокет ты должен (при завершении соединения) правильно закрыть и выгрузить.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 16.05.2005 (Пн) 16:00

alibek писал(а):Серверный не соединяется с клиентом.
Серверный принимает запросы на соединение. Когда такой запрос поступает, он добавляет в массив сокетов новый элемент и присоединяет запрос к нему, а сам слушает дальше.
Созданный сокет ты должен (при завершении соединения) правильно закрыть и выгрузить.

Сам он подчёркнутое не делает - это надо руками прописывать.
Но все сервера работают именно так.
Изображение

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

продолжу таки задават вопросы

Сообщение dklmn » 16.05.2005 (Пн) 17:04

ну все это понятно , но вот я читаю
LocalPort Возвращает или устанавливает местный порт для использования. Для клиента порт используется для отправки данных. Укажите порт 0, если приложение не требует специфического порта.
В этом случае элемент управления выберет случайный порт.

- и испытаваю лекгое беспокойство
- он выберет случайный порт, а на какой порт слать данные клиентской программе?
Потом, как корректно выгрузить элемент из массива?
То есть допустим у нас есть элемент массива винсоков sock(1)
- пока он работал, поступил еще запрос на соединение и создался новый элемент - sock(2) , пока втророй работает первый закончил сеанс связи закрылся
- если мы его выгрузим на этом месте в массиве будет дырка.
Это нормально или мы можем выгружать только элементы массива которые "сверху"?

[/i]

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2005 (Пн) 18:11

Я лично делал так:

Сделал, заведомо больший массив сокетов, чем мне нужен. 10 в моем случае. Сделал ф-цию GetFreeSocket, которая возращала, первый свободный сокет. Сокет под номером 0 не учитывается.

При ConnectionRequest, я подключал первый свободный сокет, номер которого мне выдавала GetFreeSocket.

Как только, сокет заканчивает передачу, в эвенте Socket_SendComplete, я его закрываю командой Socket.Close

Вообще, загрузить/выгрузить сокет можно командами Load socket(i), Unload socket(i)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

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

Сообщение tyomitch » 16.05.2005 (Пн) 21:11

FAKK2 писал(а):Вообще, загрузить/выгрузить сокет можно командами Load socket(i), Unload socket(i)

При Unload-е сокетов течёт память, и MS уже не будет это фиксить, потому что вышел срок поддержки.
Так что лучше ненужные сокеты не выгружать, а просто закрывать.
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2005 (Пн) 21:21

tyomitch

Я вообще то не задумывался, но спасибо за инфу.

Сам, я как раз закрываю, а не выгружаю :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

и все же , как быть с сокетами при обрывсе связи?

Сообщение dklmn » 17.05.2005 (Вт) 8:34

FAKK2 писал(а):Я лично делал так:

Сделал, заведомо больший массив сокетов, чем мне нужен. 10 в моем случае. Сделал ф-цию GetFreeSocket, которая возращала, первый свободный сокет. Сокет под номером 0 не учитывается.

При ConnectionRequest, я подключал первый свободный сокет, номер которого мне выдавала GetFreeSocket.

Как только, сокет заканчивает передачу, в эвенте Socket_SendComplete, я его закрываю командой Socket.Close

Вообще, загрузить/выгрузить сокет можно командами Load socket(i), Unload socket(i)


Ну это все понятно, возможно я так и буду делать...
Только все так что делать при обрыве связи(а у меня соединение идет через Gprs и такое будет обычной ситуацией). Если сокеты останутся висеть незакрытыми то десятка сокетов мне надолго не хватит, лучше уж делать бесконечный массив.
Как тут быть . Пока ничего лучше чем делать совместно с массивом сокетов массив таймеров, которые будут активироваться при их открытии и через заданный таймаут "пришибать" подопечный сокет если через него не идет передача, я не придумал.
Но чо то как то... что еще посоветуете?

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.05.2005 (Вт) 8:36

dklmn

Если связь обрывается, генерируется событие Socket_Error. Там можно сокет закрыть.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

Сообщение dklmn » 17.05.2005 (Вт) 8:56

FAKK2 писал(а):dklmn
Если связь обрывается, генерируется событие Socket_Error. Там можно сокет закрыть.

ага! То что надо.
Спасибо

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

Сообщение dklmn » 17.05.2005 (Вт) 10:41

FAKK2 писал(а):Я лично делал так:

.cделал ф-цию GetFreeSocket, которая возращала, первый свободный сокет. Сокет под номером 0 не учитывается.


А в этой функции как ты определял что сокет свободен
- по услвовию SomeSock(n).state =0
?

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.05.2005 (Вт) 17:58

dklmn
Код: Выделить всё

If Socket(i).State=sckClosed then GetFreeSocket=i:exit for
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.


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

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

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

    TopList