Многопользовательское приложение (Winsock)

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

Многопользовательское приложение (Winsock)

Сообщение AntonGV » 27.06.2006 (Вт) 16:01

Есть программа - сервер. Как сделать чтобы к ней мог подключаться не один клиент а несколько?
Если долго мучиться, что-нибудь получится

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 27.06.2006 (Вт) 16:12

По моему алибек делал HTTP сервер, поищи там должно быть как это делать. В МСДН есть пример, но на С++. статья называеться Write a Simple HTTP-based Server Using MFC and Windows Sockets написана была From the February 1996 issue of Microsoft Systems Journal
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

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

Сообщение AntonGV » 27.06.2006 (Вт) 16:18

С английским у меня очень туго, а с С++ темболее
Если долго мучиться, что-нибудь получится

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 27.06.2006 (Вт) 16:42

С английским у меня очень туго

А у кого хорошо :-)
Идея в двух словах такая висит сервер(касаемо HTTP сервера) на 80 порту и ждет соединения. Когда происходит соединение сервер говорит клиенту - общаться будем по такому-то, например на 4005, порту. Это соединение закрываеться и сервер снова начинает ждать запроса на соединение на 80 порту, а на 4005 порту отдельным потоком устанавливает соединение с клиентом и обслужывает его запросы. По окончании работы соединение закрываеться, поток завершаеться.
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

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

Сообщение tyomitch » 27.06.2006 (Вт) 18:28

Igor_123 писал(а):
С английским у меня очень туго

А у кого хорошо :-)
Идея в двух словах такая висит сервер(касаемо HTTP сервера) на 80 порту и ждет соединения. Когда происходит соединение сервер говорит клиенту - общаться будем по такому-то, например на 4005, порту. Это соединение закрываеться и сервер снова начинает ждать запроса на соединение на 80 порту, а на 4005 порту отдельным потоком устанавливает соединение с клиентом и обслужывает его запросы. По окончании работы соединение закрываеться, поток завершаеться.

Полный бред. Никакого диалога "общаться будем по такому-то, например на 4005, порту" в HTTP нет.
Автор, видимо, попутал с FTP.
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 28.06.2006 (Ср) 9:29

Igor_123 писал(а):
С английским у меня очень туго

А у кого хорошо :-)
Идея в двух словах такая висит сервер(касаемо HTTP сервера) на 80 порту и ждет соединения. Когда происходит соединение сервер говорит клиенту - общаться будем по такому-то, например на 4005, порту. Это соединение закрываеться и сервер снова начинает ждать запроса на соединение на 80 порту, а на 4005 порту отдельным потоком устанавливает соединение с клиентом и обслужывает его запросы. По окончании работы соединение закрываеться, поток завершаеться.


Вот такие гады и придумали ФТП, один из самых убогих веб протоколов. MustDie!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.06.2006 (Чт) 1:21

Отвечу на вопрос автора. Чтобы можно было подключаться нескольким клиентам нужно динамически, т.е. во время выполнения создавать массив Сокетов (т.е. массив объектов класса ВинСок) и при ConnectRequest создавать новый элемент и вызвать у него Аккепт.

Вроде бы так. просто уже год до винсока руки не доходили
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение AntonGV » 29.06.2006 (Чт) 18:29

Спасибо. А массив сокетов создается так?
Код: Выделить всё
dim socket() as winsock

или как-то подругому, обьясни пожалуйста.
Если долго мучиться, что-нибудь получится

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.06.2006 (Чт) 18:33

Нет, создаётся Socket на форме и ставится ему индекс 0.

Потом Load Socket(1), Load Socket(2) и тд.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение AntonGV » 30.06.2006 (Пт) 3:58

Ясно. Спасибо.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 30.06.2006 (Пт) 8:22

Вопрос: как определить количество значений массива? :roll:
Подпись находится в стадии разработки...

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

Сообщение alibek » 30.06.2006 (Пт) 8:33

Ubound-LBound+1
Массив контролов это не совсем массив, там использовать свойства .UBound, LBound.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение AntonGV » 30.06.2006 (Пт) 10:14

Я тоже хотел задать этот вопрос, но Конь меня опередил :)

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

Сообщение AntonGV » 30.06.2006 (Пт) 10:46

1) А можно как-нибудь опредилить количество "использованных" элементов массива, ну в которых есть какое-ибудь значение?
2) Можно ли "обнулить" сразу весь массив или только так:
Код: Выделить всё
dim i as Integer
dim mas(100) as String
 
for i=0 to Ubound(mas)-LBound(mas)+1
  mas(i)=vbNullString
Next i

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 30.06.2006 (Пт) 10:48

Erase

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.06.2006 (Пт) 12:13

И опять же замечу что для массива контроллов Эрэйс на подходит
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 13.07.2006 (Чт) 11:59

а почему нельзя их простым index'ом проверить

Private Sub ListenSocket_ConnectionRequest(ByVal requestID As Long)
Load Winsock2(Winsock2.Count + 1)
Winsock2(Winsock2.Count).Accept requestID
End Sub

другое дело, что у тебя могут некоторые соединения из существующих отвалится....
поэтому можно новое ловить на существующий сокет, сделать сначала проверку winsock.state

Private Sub ListenSocket_ConnectionRequest(ByVal requestID As Long)
for t=1 to winsock.count
if winsock(t).state=8 or winsock(t).state=0 then goto asd
next t

Load Winsock(Winsock.Count + 1)
Winsock(Winsock.Count).Accept requestID
exit sub

asd:
winsock(t).close 'если статус 8
winsock(t).accept.request id
end sub

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

Сообщение CodeName33 » 19.09.2006 (Вт) 14:41

Извиняюсь, что поднимаю старую тему, но зачем же мучатся с массивом контролов. ИМХО криво, ибо иногда нужно удалять из середины и потом получается каша с пустыми элементами внутри, а не массив...

Можно сделать через Controls.Add а события обрабатывать в классах.

Например:

В модуле:
Код: Выделить всё
Public colWSock As New Collection


A в классе:
Код: Выделить всё
Public WithEvents WS As Winsock

Private Sub Class_Initialize()
Dim RandomName As String

'Генерируем тут RandomName на основе милисекунды и счётчика или т.п...

Set WS = %ФОРМА%.Controls.Add("MSWinsock.Winsock.1", "WS" & RandomName)
colWSock.Add WS, WS.Name
End Sub

Private Sub Class_Terminate()
On Error Resume Next
fMain.Controls.Remove WS
colWSock.Remove WS.Name
End Sub


При создании нового эксемпляря класса - он сам создаёт Winsock и добавляет его в коллекцию colWSock, а при уничтожении класса уничтожает Winsock и удаляет из коллекции colWSock. В результате в коллекции colWSock у нас всегда только рабочие Winsock'и.
В этих классах мы можем обрабатывать события для каждого нового винсока, или при необходимости переназначить их на Public процедуру. Мне кажется так удобнее работать, чем с массивами.
Программисты не глючат - глючат компиляторы...

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

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

Объясните, зачем весь этот гемморой с массивами контролов?
Чтобы реализовать то, что нужно автору достаточно одного контрола.

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

Сообщение alibek » 19.09.2006 (Вт) 15:16

Сервер на одном сокете?
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 19.09.2006 (Вт) 15:18

CodeName33, идея спорная.
Но в любом случае, для RandomName гораздо больше подойдет "WS" & CStr(ObjPtr(Me)), чем какие-то танцы с таймерами, миллисекундами и счетчиками.
Lasciate ogni speranza, voi ch'entrate.

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

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

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

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

Сообщение CodeName33 » 19.09.2006 (Вт) 15:22

|kerish| здесь, я так понял TCP-IP протокол используется, а не UDP, одним контролом тут не отделаться...

Добавлено:
Смотря что это за сервер. Здесь я уточнения не видел. Возможно клиенты у него будут браузеры...

alibek, это я для примера написал про милисекунды. Твой метод генерации проще и удобнее.
Последний раз редактировалось CodeName33 19.09.2006 (Вт) 15:27, всего редактировалось 1 раз.
Программисты не глючат - глючат компиляторы...

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

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

Прошу прощения, что мое сообщение продублировалось.

CodeName33 А я так понял, что автору нужно многопользовательское приложение (Winsock), чтобы к нему мог подключаться не один клиент а несколько. А протокол автор может выбрать сам.

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

Сообщение alibek » 19.09.2006 (Вт) 15:27

Допустим, у меня есть сервер, который трафик шифрует. Причем, для каждого соединения (клиента) используется свой сессионный ключ.
Здесь UDP мало применим.
Lasciate ogni speranza, voi ch'entrate.

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

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

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

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

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

alibek Ничего подобного. Сервер легко сможет распозновать от кого какое-сообщение и соответственно ему шифровать и расшифрововать.

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

Сообщение alibek » 19.09.2006 (Вт) 15:39

Ага, и рассылать по сетке датаграммы, засоряя канал.
Lasciate ogni speranza, voi ch'entrate.

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

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

alibek Объясни, пожалуйста по-подробнее, что ты имеешь в виду.

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

Сообщение alibek » 19.09.2006 (Вт) 15:48

Во-первых, датаграммы не фрагментируются (и соответственно, не буферризуются).
Во-вторых, надеюсь ты имел ввиду рассылку по подсети, а не на конкретный адрес?
Кроме того, UDP не гарантирует доставки и не гарантирует соединения, т.е. ты не можешь делать предположения, что данные ты отправил именно тому, кому надо.
Lasciate ogni speranza, voi ch'entrate.

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 143

    TopList