VB и интернет. Обмен данными с php

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

VB и интернет. Обмен данными с php

Сообщение ale_x » 08.03.2008 (Сб) 12:51

Уважаемые знатоки, подскажите как лучше реализовать подключение к серверу и обмен данными с php программой. Точнее нужно реализовать процедуры авторизации пользователя (как в аське: пользвоатель проходит авторизацию а потом ему доступны все сервисы), т.е. пользователь должен ввести к окно программы логин, пароль, а программа должна отправить данные серверу и получить ответ (отправка и получение это не проблема), а вот как подерживать соединение я не знаю, у меня получается, что как только программа передает данные серверу, мой winsock закрывает соединение и сессия на сервере закрывается. Как можно сделать чтобы при отправки данных winsock не закрывал соединение?

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

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

Сообщение Хакер » 08.03.2008 (Сб) 13:19

Стоп.

php-программой или php-скриптом?

Winsock не закрывает соединение, если ты сам его не заставишь. Соединение, судя по всему, закрывает другая сторона.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 17:08

Обрабатывается php скриптом, проблема в том что после передачи и получения данных статус winsock становится 0, т.е. выполняется соединение статус 7, после отправки и получение данных статус становится 0. В программе никаких кодов закрытия соединение или смены статуса нет

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

Сообщение Хакер » 08.03.2008 (Сб) 17:10

Очевидно, сервер закрывает соединение. Ты точно соблюдаешь все требования протокола HTTP?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 17:10

Хакер писал(а):
Winsock не закрывает соединение, если ты сам его не заставишь. Соединение, судя по всему, закрывает другая сторона.


А как тогда быть? :(

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

Сообщение ale_x » 08.03.2008 (Сб) 17:14

я делаю так:
устанавливаю параметры и соединение:
Winsock1.Protocol = sckTCPProtocol 'Установка протокола
Winsock1.Connect "localhost", 80 'подключение через порт 80
While Not Winsock1.State = 7 'Ждем, пока подключится.
DoEvents '
Wend '

Потом отсылаю данные:
Winsock1.SendData "index.php?login=name&password=123" & vbCrLf
Winsock1.SendData "Host: localhost" & vbCrLf & vbCrLf


Получаю ответ:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
Winsock1.GetData Data
Label1.Caption = Data
End Sub

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

Сообщение Хакер » 08.03.2008 (Сб) 17:19

Код: Выделить всё
Winsock1.SendData "index.php?login=name&password=123" & vbCrLf
Winsock1.SendData "Host: localhost" & vbCrLf & vbCrLf

Бред. Читаем RFC2616

GET /index.php?login=name&password=123 HTTP/1.1 должно быть. И одним вызовом SendData, а не десятком, по одному на каждый заголовок. И почему нет остальных заголовков?

... и он ещё удивляется.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 17:39

Хакер писал(а):
HTTP/1.1 должно быть. И одним вызовом SendData

Все простое - гениально! Спасибо большое теперь вроде все заработало, одно я не понял, а что значить
Хакер писал(а):
И одним вызовом SendData

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

Сообщение Хакер » 08.03.2008 (Сб) 17:40

Winsock1.SendData "ыыыыы" + vbCrLf + "ыыыы" + vbCrLf + "ыы" + vbCrLf+ vbCrLf
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 17:41

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

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

Сообщение Хакер » 08.03.2008 (Сб) 17:42

Код, который получился, сюда давай.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 17:45

Весь?

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

Сообщение Хакер » 08.03.2008 (Сб) 17:47

Подключение, отправка, приём.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 17:48

Код: Выделить всё
Private Sub Command1_Click()

Winsock1.Protocol = sckTCPProtocol 'Установка протокола
Winsock1.Connect "localhost", 80 'подключение через порт 80
While Not Winsock1.State = 7 'Ждем, пока подключится.
DoEvents '
Wend '
End Sub

Private Sub Command2_Click()

Winsock1.SendData "POST /index.php?login=name&password=123 HTTP/1.1" & vbCrLf + "Accept -Language: ru" & vbCrLf + "Content-Type: application/x-www-form-urlencoded" & vbCrLf + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" & vbCrLf + "Host: localhost" & vbCrLf + "Connection: Keep -Alive" & vbCrLf + "cache -Control: no -cache" & vbCrLf & vbCrLf
End Sub

Private Sub Timer1_Timer() ' показывает статус winsoka
Label2.Caption = Winsock1.State
End Sub

Private Sub Winsock1_Close()
Winsock1.Close
End Sub


Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
Winsock1.GetData Data
Label4.Caption = "Получение данных"
Label1.Caption = Label1.Caption & Data
End Sub


Private Sub Winsock1_SendComplete()
Label4.Caption = "Отправка завершена"
End Sub



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

Сообщение ale_x » 08.03.2008 (Сб) 17:54

У меня тут несколько проблем:
1-ая соединение автоматически закрвается через некоторое время, приблизительно 2 минуты
2-ая даже при соединенном сессия закрывается сервером, т.е. елси сперва послать строку POST /index.php?login=name&password=123 HTTP/1.1 то сессия создается и сервер авторизует, а если сразу же после предыдущего, не закрывая соединение, послать
POST /index.php HTTP/1.1 то сервер отвечает что вы не вторизованы, хотя только что отсылалсь строка слогином и паролем и срвер создал сессию.
Может я чета не догоняю, помогите, нжно сделать как у IE закрыл окно - сессия на сервере закрыласью.

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

Сообщение Хакер » 08.03.2008 (Сб) 17:56

Фу.
1) Чем обусловлена необходимости записи всей этой каши из заголовков в одну строчку?
2) Keap -Alive , Accept -Language, cache -Control, no -cache - что там делают пробелы? В таком виде оно превращается в бесполезный мусор, который сервер просто не воспринимает. А между тем Connection - нужный в данном случае заголовок. Только его значение = дрянь. К тому же, если бы там было Keap-Alive, было бы всё равно дрянью, потому что не Keap, а Keep. И всё равно, было бы ерундой, потому что в данном случае должно закрытое, ибо ты ничего не отсылаешь после получения ответа в этот же сокет.
3) И зачем POST?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Хакер » 08.03.2008 (Сб) 18:05

(Пока я писал, последовало дополнение. Что-ж, отвечу)

Ещё раз фу. Я думал ты не знаешь VB, а так, как выясняется, не знаешь ещё и PHP.

1-ая соединение автоматически закрвается через некоторое время, приблизительно 2 минуты

PHP-скрипт не может работать вечно. Он закрывается по таймауту. Таймаут определён в конфигурационном файле php.ini, в секции [PHP], параметр называется max_execution_time.

2-ая даже при соединенном сессия закрывается сервером, т.е. елси сперва послать строку POST /index.php?login=name&password=123 HTTP/1.1 то сессия создается и сервер авторизует, а если сразу же после предыдущего, не закрывая соединение, послать POST /index.php HTTP/1.1 то сервер отвечает что вы не вторизованы, хотя только что отсылалсь строка слогином и паролем и срвер создал сессию.

Механизм сессий в PHP основывается не святом духе, а на cookie-ях, на которые ты никакого внимания не обращаешь. И ещё чему то удивляешься...
Последний раз редактировалось Хакер 08.03.2008 (Сб) 18:13, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 18:10

Я изменил post на get, убрал пробелы и правильно написал keep, теперь в ответе сервера есть строка Keep-Alive: timeout=15, max=100
И ровно через 15 сек соединение закрывается. и опять возникает вторая проблема: 2-ая даже при соединенном сессия закрывается сервером, т.е. елси сперва послать строку GET /index.php?login=name&password=123 HTTP/1.1 то сессия создается и сервер авторизует, а если сразу же после предыдущего, не закрывая соединение, послать
GET /index.php HTTP/1.1 то сервер отвечает что вы не вторизованы, хотя только что отсылалсь строка с логином и паролем и срвер создал сессию.

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

Сообщение Хакер » 08.03.2008 (Сб) 18:12

А ты второй ответ-то перечитай, а?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 18:14

И как с этим всем бороться? Подскажите здравое решение проблемы

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

Сообщение ale_x » 08.03.2008 (Сб) 18:16

Я запутался :shock:

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

Сообщение Хакер » 08.03.2008 (Сб) 18:18

Здравое решение проблемы - делать как надо, а не чёрт знает как. Здравое решение проблемы - купить книжку или прочитать RFC-2616 ссылку на который я привёл.

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

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

Сообщение ale_x » 08.03.2008 (Сб) 18:33

Хакер писал(а):Механизм сессий в PHP основывается не святом духе, а на cookie-ях, на которые ты никакого внимания не обращаешь.
Так что использовать куки?. А что если у пользователя отключена поддержка куки?

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

Сообщение Хакер » 08.03.2008 (Сб) 18:35

У него не будут работать сессии. PHP умён, правда, он может использовать GET-переменные для отправки ИД-а сессии. Т.е. не куку PHPSESSID устанавливать, а передавать это ID сессии например так: &sid=1321321321321321321a5151a212
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 18:47

т.е. как я понял, я должен после авториации и создания сессии передать строку GET index.php?sid=123123121231....., sid который получи при создании сессии и ответе сервера?
Хорошо, а как тогда браузер работает, ведь он не передает в строке никаких параметров, типа sid=123123123 ?

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

Сообщение Хакер » 08.03.2008 (Сб) 18:51

Он передаёт куку. А если куки выключены, и броузер ничего н передаёт, значит, параметр session.use_trans_sid в php.ini выключен и сессии не работают.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 18:57

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

Ну да ладно вопрос не в этом как реализовать, то если соединение закрывается через 15 секуд, а так каждый раз что-ли через 15 секунд авторизировать получать sid параметр, ведь он создается каждый раз новый. А как тогда работает mail агент, ведь он авторизиуется один раз, при подключении к интернету, как токо подключились атворизировался и все. А может есть случайно какой-нить нагдяный пример, реализующий это, может где-то завалялся? :lol:

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

Сообщение Хакер » 08.03.2008 (Сб) 19:04

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

Ты глубоко заблуждаешься. Сессии в PHP - механизм позволяющий программисту хранить какие-либо данные на стороне сервера, привязывая их к конкретному клиенту. Данные помещаются в файл на сервере, в папку, указанную в параметре session.save_path. Для того чтобы однозначено определить конкретного клиента, ему присваивается псевдо-уникальный ID называемый также session_id, который генерируюется специальным образом (определяется в php.ini). Структура данных, хранящаяся в $_SESSION сериализуется (стандартной функцией, или иным способом (указывается в php.ini)) и помещается в директорию в файл, имя которого совпадает с ID-ом сессии.

Ну да ладно вопрос не в этом как реализовать, то если соединение закрывается через 15 секуд, а так каждый раз что-ли через 15 секунд авторизировать получать sid параметр, ведь он создается каждый раз новый. А как тогда работает mail агент, ведь он авторизиуется один раз, при подключении к интернету, как токо подключились атворизировался и все. А может есть случайно какой-нить нагдяный пример, реализующий это, может где-то завалялся?

Агент работает не по такой убогой схеме. Он не использует php-скрипты и протокол HTTP (который вообще для другого задумывался) для своих целей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение ale_x » 08.03.2008 (Сб) 19:12

Спасибо, за краткий курс, уяснил. А по какой схеме работает агент?
Тогда мой вопрос наверно сводится к другому: как создать нормального агента на Visula Basic.

Можно хотя бы какой-нибудь простой пример клиента на VB обменивающийся данными с сервером.

Ведь как-то его можно реализовать?

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

Сообщение Хакер » 08.03.2008 (Сб) 19:15

На другой стороне должна быть нормальная программа-сервер. Именно программа, EXE-файл файл т.е., желательно многопоточный. Можешь даже на VB его написать, только на сервере должна винда стоять.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

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

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

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

    TopList