Winsock и Winsock`и.

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

Winsock и Winsock`и.

Сообщение Proxy » 19.02.2008 (Вт) 15:38

Начал писать свой протокол передачи мгновенных сообщений (Цель: сделать экономичный к трафу протокол, простой в изучении). Написал клиентскую часть (процентов 90), начал писать серверную часть, но столкнулся с тем, что не понимаю как к одному винсоку сервера приконнектить много клиентов. Действую по следующему алгоритму:
Сервер слушает
Клиент пытается подключиться
Сервер выключает прослушивание порта
Сервер подтверждает подключение
Работает с клиентом
...

А вот как приконнектить ещё клиенты?
(Винсок юзаю из-за наглядности, API конечно лучше, но сервер мне нужен только для выявления ошибок в работе клиента, для доработки и испытания. Сервер в данном случае является только прототипом, потом будет вполностью переписан на другом языке).

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 19.02.2008 (Вт) 16:09

Массив винсоков +1 "Слушатель".
Сервер получает запрос на соединение, инитит новый винсок в массиве, и соеднияет его с клиентом. После чего продолжает слушать.
label:
cli
jmp label

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 19.02.2008 (Вт) 16:27

Т.е. одним портом на сервере не обойтись? Надо много портов выделять? На каждый клиент свой? Это разве реально?
Или много винсоков могут юзать один порт? А вынь не напишет разве, что порт уже занят?

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 19.02.2008 (Вт) 17:53

Вот пример
Вложения
TCPIP_MulticlientEchoSvr.zip
(5.82 Кб) Скачиваний: 65
Если долго мучиться, что-нибудь получится

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 20.02.2008 (Ср) 0:58

На мой взгляд этот способ несет в себе два недостатка:

Первый - это ограничение на количество одновременных соединений чуть меньше 32767.

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

Я бы заюзал UDP протокол, но тогда серверу надо будет постоянно удостоверяться, что пакет дошел, возвращая ему один байт, например.

ale_x
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 04.03.2008 (Вт) 13:18

Сообщение ale_x » 13.03.2008 (Чт) 13:19

Количество занимаех портов зависит от типа подключения. Например если UPD то для каждого подключения юзается свой порт. Создается связь между клиентом-сервером, резервируется порт. Пока соединение не будет разорвано, то доступ к порту другими программами будет закрыт.
Если TCP соединение то тогда один порт, просто создается сокет между клиентом-сервером. А что бы подлюкчать много клиентов: создашь массив winsocka на сервере и при подключении в массив добавляешь +1 и все. Так при подключении каждого будет создавать свой winsock.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 25.03.2008 (Вт) 15:32

ale_x писал(а):Количество занимаех портов зависит от типа подключения. Например если UPD то для каждого подключения юзается свой порт. Создается связь между клиентом-сервером, резервируется порт. Пока соединение не будет разорвано, то доступ к порту другими программами будет закрыт.
Если TCP соединение то тогда один порт, просто создается сокет между клиентом-сервером. А что бы подлюкчать много клиентов: создашь массив winsocka на сервере и при подключении в массив добавляешь +1 и все. Так при подключении каждого будет создавать свой winsock.


Уважаемый, Вы уж звиняйте, но Вы абсолютно не в теме.
Все написанное вами - бред шизофреника.
Даже не берусь комментировать.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 25.03.2008 (Вт) 18:37

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

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

Сообщение alibek » 25.03.2008 (Вт) 21:24

Это уже тебе решать.
Можешь сделать так, что когда число клиентов превышает определенный лимит, то новые клиенты подключаются, им высылается сообщение "Нет свободных портов" и они отключаются сервером. Клиенту будет приятна такая забота, но тогда твое приложение потенциально уязвимо для DDoS-атаки.
Можно просто игнорировать все запросы, если количество подключений достигло лимита. Но тогда клиентам будет не очень удобно, это будет означать долгую попытку подключения и ошибку по таймауту, по неизвестной причине. Но зато это более безопасно для сервера.
Lasciate ogni speranza, voi ch'entrate.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 26.03.2008 (Ср) 3:20

Я всё же не могу понять зачем юзать TCP?
Чем UDP не угодил?
Ну лишний байт будет приходить для отчетности доставки, зато обо всех проблемах с портами можно забыть.

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

Сообщение alibek » 26.03.2008 (Ср) 8:38

А ты почитай об ограничениях UDP и подумай.
UDP не всегда подходит.
Lasciate ogni speranza, voi ch'entrate.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 26.03.2008 (Ср) 11:33

alibek Ну и какое же у него ограничение кроме ненадежности?

Поясни, плз, просто я сейчас как раз пишу приложение и решил использовать именно UDP протокол.

Как я уже сказал доставка пакета легко проверяется возвращением байта к примеру.

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

Сообщение alibek » 26.03.2008 (Ср) 12:06

Маршрутизация. Фрагментация.
Lasciate ogni speranza, voi ch'entrate.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 26.03.2008 (Ср) 13:32

Почитал по теме, спасибо.

Но вобщем-то не нашел ничего страшного.

Огромное число игр используют UDP для передачи данных, тот же Conter-Strike.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 26.03.2008 (Ср) 14:06

Потеря пакета в игре - не так страшна.
label:
cli
jmp label

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

Сообщение alibek » 26.03.2008 (Ср) 14:12

А что еще кроме контр-страйка?
Вообще-то для мультиплейера чаще используют TCP, чем UDP. И даже тот же контрстрайк также использует TCP-соединение, уже не помню, для чего.

Также попробуй по UDP отправить пакет данных размером в 2Кб.
В сетевой игре потребности в этом нет, пакеты данных там небольшие. А в сетевом приложении может и потребоваться.
Также попробуй пообщаться по UDP с компьютером, который находится за NAT.
Lasciate ogni speranza, voi ch'entrate.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 26.03.2008 (Ср) 16:35

Я понял, буду юзать TCP.

А какой максимальный размер пакета, который может послать/принять WinSock за один раз?

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

Сообщение alibek » 26.03.2008 (Ср) 16:46

Зависит от конфигурации машины и сети.
Обычно 1400 с чем-то байт.
TCP сам фрагментируется, доставляется и собирается, тебе об этом беспокоится не надо. А с UDP тебе придется реализовать подобный механизм самостоятельно.
Кроме того, хотя UDP и натится, но порой с этим бывают всякие проблемы. Поэтому UDP вполне оправдан в локальных сетях, а в глобальных надо вначале изучить вопрос.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList