Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Игровой сервер winsosk / 25 сообщений из 63, страница 1 из 3
29.11.2013, 20:29
    #38484076
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Задача сделать сервер с авторизацией.

На сервер поступает запрос открытия сессии. Открываем. В этой сессии приходят логин и пароль. Проверяем и при совпадении с имеющимися в базе логина и пароля, привязываем к массиву данных, закрепленными за этими атрибутами входа.

Ставим на форме winsock1 с индексом 0
в теле программы пишем

Код: vbnet
1.
2.
3.
4.
5.
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    NumSockets = NumSockets + 1
    Load Winsock1(NumSockets)
    Winsock1(NumSockets).Accept requestID
End Sub



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

Допустим у нас зарегестрировано 3 пользователя с логином и паролем соответственно: Пользователь1..3, Пароль1..3
у каждого пользователя свой массив данных на сервере, допустим list1.list(0..2) соответственно.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
dim priem1..3 as string
winsosk1(?????).getdata priem1
winsosk1(????).getdata priem2
winsosk1(???).getdata priem3
'открыли сессию Пользователь2 и Пользователь3, прислали свои логины и пароли сюда,
'но как определить к какой сессии какой "ДатаАрривал-getdata" относится, что бы им отослать данные?
'Логин и пароль то к листу не проблема привязать, а вот в какую сесиию это отправлять?
End Sub


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
29.11.2013, 20:56
    #38484092
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
я пока до одного способа додумался, но громоздкий в кубе
сессия 1 = winsock1(1)
сессия 2 = winsock1(2)
сессия 3 = winsock1(3)


winsock1(1).getdata = priem1 (пришло Пользователь2/Пароль2)
if priem1 = Пользователь1/Пароль1 then привязываем к list1.list и winsock1(1)
if priem1 = Пользователь2/Пароль2 then привязываем к list2.list и winsock1(1)
.........
if priem1 = Пользователь500/Пароль500 then привязываем к list500.list и winsock1(1)


winsock1(2).getdata = priem2 (пришло Пользователь1/Пароль1)
if priem2 = Пользователь1/Пароль1 then привязываем к list1.list и winsock1(2)
if priem2 = Пользователь2/Пароль2 then привязываем к list2.list и winsock1(2)
.........
if priem2 = Пользователь500/Пароль500 then привязываем к list500.list и winsock1(2)
.
.
winsock1(500).getdata = priem500 (пришло Пользователь67/Пароль67)

иначе никак??? только циклами сократить?
...
Рейтинг: 0 / 0
29.11.2013, 21:01
    #38484099
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
допустим у меня есть лист на 500 строк, в каждой строке атрибуты входа:
Пользователь1/Пароль1
Пользователь2/Пароль2
..
Пользователь500/Пароль500

как сравнить winsock1(1) priem1 с этим листом на предмет совпадения и выдать строку которая совпала?
...
Рейтинг: 0 / 0
29.11.2013, 21:06
    #38484102
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Ghepardсвой массив данных на сервереGhepardдопустим у меня есть листдавайте определимся, где хранятся данные и вообще какая среда разработки
...
Рейтинг: 0 / 0
29.11.2013, 22:43
    #38484139
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
vb6, данные логин и пароль хранятся на сервере в list1, каждая строка это логин и пароль одного сервера, клинт присылает строку типа *вася45/dfgsdge#всякие данные^
...
Рейтинг: 0 / 0
29.11.2013, 22:45
    #38484140
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
кнопки редактировать ненашел))
vb6, данные логин и пароль хранятся на сервере в list1, каждая строка это логин и пароль одного пользователя*, клиент присылает строку типа *вася45/dfgsdge#всякие данные^
...
Рейтинг: 0 / 0
29.11.2013, 22:53
    #38484145
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Что такое list1? Контрол ListBox? Контрол ListView? Или может какой-то класс? Если желаете получить качественный ответ, не жалейте букв на качественный вопрос. Я, было, сначала подумал, что пароли хранятся на листе экселя.

Как данные туда попадают - из какого источника?
...
Рейтинг: 0 / 0
29.11.2013, 23:06
    #38484157
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
да ListBox, данные переодически подгружаются из обычного текстового файла
...
Рейтинг: 0 / 0
29.11.2013, 23:07
    #38484158
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
кстати было бы неплохо подгружать их из экселя, но это я еще не умею, наверное не всё так просто)
...
Рейтинг: 0 / 0
29.11.2013, 23:28
    #38484171
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
А зачем они подгружаются в LisBox? В этом есть какой-то сакральный смысл?
Для проверки логина-пароля придется делать полный перебор элементов в цикле.
Лучше тогда уж подгружать в коллекцию или словарь, там, по крайней мере, его можно быстро проверить.
А по-хорошему все это должно храниться не в текстовом файле, а в файле БД, и непосредственно в нем же проверяться с помощью простого SQL-запроса.

(вопросы хэширования пароля пока опустим...)
...
Рейтинг: 0 / 0
29.11.2013, 23:43
    #38484179
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
автор'но как определить к какой сессии какой "ДатаАрривал-getdata" относится, что бы им отослать данные?winsosk1( Index ).getdata
...
Рейтинг: 0 / 0
30.11.2013, 00:07
    #38484192
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
понятно, что по хорошему это всё нужно делать так как Вы сказали, но у меня для этого нет багажа знаний, если по шагам подскажите буду только рад, а с нуля это всё перелопатить наверное неделя у меня уйдет если не больше.

косательно winsock(index) getdata, можно поподробней?

как правильно:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dim ind as integer

Private Sub Winsock1_ConnectionRequest(index As Integer, ByVal requestID As Long)  
    ind = ind + 1
    Load Winsock1(ind)
    Winsock1(ind).Accept requestID
End Sub

Private Sub Winsock1_DataArrival(index As Integer, ByVal bytesTotal As Long)   
Winsock1(ind).GetData
End Sub



или

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Winsock1_ConnectionRequest(index As Integer, ByVal requestID As Long)  
    Load Winsock1(index)
    Winsock1(index).Accept requestID
End Sub

Private Sub Winsock1_DataArrival(index As Integer, ByVal bytesTotal As Long)   
Winsock1(index).GetData
End Sub
...
Рейтинг: 0 / 0
30.11.2013, 00:15
    #38484198
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
в крации итого уже назрел вопрос как это всё хотя бы в циклы компактненько засунуть




1. создали много сессий (рекуест) где сессия 1 завязана с winsock1(1), 2 c winsock1(2) и т.д.
2. в датаарривале обрабатываем "входящий в данный момент" winsock1(x) на предмет поиска строки в листе в которой идентичное значение getdate
что-то типа
Код: vbnet
1.
2.
3.
For i = 0 To 60
If List1.List(i) = Text1 Then Text2 = i
Next i
...
Рейтинг: 0 / 0
30.11.2013, 00:32
    #38484204
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
в идеале бы конечно проверять логин и пароль ещё в рекуесте, но winsock уж так сделан, что это невозможно, если бы знать его внутренность да переделать его, но это уже для меня слишком сложно
...
Рейтинг: 0 / 0
30.11.2013, 00:54
    #38484211
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Ghepardа с нуля это всё перелопатить наверное неделя у меня уйдет если не больше.То есть вы хотите написать игровой сервер на сокетах, обладая нулевыми знаниями? Оригинально. Так же оригинально, как загружать списки данных в ListBox для хранения.

Естественно уйдет неделя или больше. Надо просто взять учебник и прочитать его. Я же не буду писать учебник прямо в вашем топике. Я подсказываю направления, куда копать, а копать - вам самому.
...
Рейтинг: 0 / 0
30.11.2013, 03:36
    #38484236
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
лист бокс для наглядности мониторинга происходящего))) с учебником запара, тонну воды мне не очень хочется перечитывать, а по запросу как привязать аксцес к вб и ещё в нем скюэль запросами из вне трынькать, в яндексе я думаю океан на меня ерунды выльется, так ша пока обойдемся текстовым файлом. про перебор понятно, знач моя догадка не беспочвенна была, теперь хотя это красиво оформить и наконец разобраться с этими "index" есть ли смысл их мучать или проще свои юзать.
...
Рейтинг: 0 / 0
30.11.2013, 10:15
    #38484285
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Вопрос на засыпку:
1. В vb случайные числа генерируются не совсем случайно, т.е. если выключить и включить проект, он будет выдавать ту же последовательность случайных чисел. например rnd(1): 0,7055475 0,533424 0,5795186, после перезапуска проекта rnd(1): rnd(1): 0,7055475 0,533424 0,5795186, то есть то же самое.
Предпологаю что идентивикатор requestID в
Код: vbnet
1.
2.
3.
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
.....
End Sub


также после перезапуска сервера, начнет гнать те же номера.

Теперь ситуация. Учитывая, что дисконнект можно отследить только если отправить данные, то при неактивном простое клиента и сервера дисконнект не всплывет. Итак winsock1(1) сервера открыл сессию с клиентом допустим №1. Пятиминутный простой, пересылки данных нет. Сервер в течении этого времени решили перезапустить. Клиент №1 по прежнему молчит. За то клиент №2 приконектился первым, соответственно сервер ему открыл сессию winsock1(1), с тем же requestID что и до перезапуска. Второй клиент авторизовался отправив логин и пароль, на сервере присвоился к доступ к данным для клиента 2. Опять простой сети, данные не шлют друг другу и вдруг у клиента №2 обрывается интернет, но на сервере сессия по прежнему висит. Тут клиент №1 решил что-нибудь послать на сервер, но т.к. процесс авторизации он прошел, то для облегчения обмена данных ранее было принято решение слать логин и пароль только при запуске клиента. Итак сессия идентичная для клиента №1 по прежнему висит на сервере, но она привяза уже к данным пользователя 2, сооответственно теперь клиент №1 безприпятственно работает с данными на сервере для клиентa №2. Если всё описанное выше мной правильно, значит, нет выбора и надо в кадой пересылке данных слать логин и пароль чтобы не было таких нахлестов?
...
Рейтинг: 0 / 0
30.11.2013, 10:39
    #38484297
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
вдогонку:
рекуест наверное используется 1 раз и потом как таковой "не используется" в трафике, а только для поиска внутри системы как идентификатор? Тогда открытая сессия наверное хранит ip адрес, поэтому получится еще веселей, второй клиент будет отсылать данные на сервер, а сервер после обработки будет отсылать данные второму, но первый тоже будет посылать в эту сессию и а второй уже получать результат от сервера)? Если опять всё правильно, то если с одного ip запустить 2 клиента, тоже будет котовасия?
...
Рейтинг: 0 / 0
30.11.2013, 12:23
    #38484333
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Ghepard1. В vb случайные числа генерируются не совсем случайно, т.е. если выключить и включить проект, он будет выдавать ту же последовательность случайных чисел.То есть не то, что учебник, а даже справку по rnd открыть не хватает времени?
...
Рейтинг: 0 / 0
30.11.2013, 12:55
    #38484354
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
причём тут rnd? в форм лоад для рекуеста тоже рандомайз пишут? хва цеплятся, по делу расскажи
...
Рейтинг: 0 / 0
30.11.2013, 13:00
    #38484357
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
По делу я уже говорил, ты игнорируешь.
По случайным числам - используй Randomize и будут тебе случайные числа.
Не хочешь помощи - не надо, делай сам.
...
Рейтинг: 0 / 0
30.11.2013, 13:18
    #38484369
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
вот написал, подскажите где можно улучшить или может ошибки подводные где есть?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Dim NumSockets As Integer
Dim priem(10000) As String

Private Sub Command1_Click()
Log_Pass.Clear
Open "autoriz.txt" For Input As #1
Do Until EOF(1)
Line Input #1, numuser
Log_Pass.AddItem (numuser)
Loop
Close #1
End Sub

Private Sub Form_Load()
Winsock1(0).Listen
End Sub


Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    NumSockets = NumSockets + 1
    Load Winsock1(NumSockets)
    Winsock1(NumSockets).Accept requestID
End Sub


Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Winsock1(Index).GetData priem(Index)
For i = 0 To 10000
If Log_Pass.List(i) = priem(Index) Then usernum = i
Next i
End Sub
...
Рейтинг: 0 / 0
30.11.2013, 13:19
    #38484370
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
(По делу я уже говорил, ты игнорируешь.
По случайным числам - используй Randomize и будут тебе случайные числа.
Не хочешь помощи - не надо, делай сам.)

МНЕ СЛУЧАЙНЫЕ ЧИСЛА НЕ НУЖНЫ!!!!!!!!!!! я спросил как работает рекуест в винсоксе, криво как рнд или там рэндом нормальный и каждый раз другие числа для подверждения открытия сессии.
...
Рейтинг: 0 / 0
30.11.2013, 13:33
    #38484376
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
Как именно идентифицируется TCP-сессия в винсоке - это тебя не должно волновать, это не твой уровень абстракции: To write client or server applications you do not need to understand the details of TCP or to call low level Winsock APIs. Если сомневаешься, проведи эксперимент. Перезапуск приложения приведет к обрыву сессий, естественно.
...
Рейтинг: 0 / 0
30.11.2013, 13:53
    #38484397
Ghepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игровой сервер winsosk
сейчас нет железа провести эксперимент, а раньше выдергивал кабель, сессия сохранялась (при условии если данные не передаются, а то бы сразу ошибка была, висела долго, может даже бесконечно)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Игровой сервер winsosk / 25 сообщений из 63, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]