![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Добрый день.
Прошу мне помочь. Стоит задача в авторизации на сайте. Чтобы потом отправлять данные. Опытным путем было установлено, что через GET сайт не воспринимает данные (логин и пароль). Т.е. нужно через POST. А значит, насколько я знаю, вариант через URLDownloadToFile не получится. Т.е. мне нужно использовать winsock. Так ведь? Но примеры из mdsn и которые я загуглил не освещают эту тему. Может быть, я плохо искал? Не покажите ли пример, как мне это сделать? Или может быть я вообще ошибаюсь, и тут надо не через winsock? Пишу в этом разделе, потому что хочу на "чистом" WinAPI. Буду рад любому ответу. |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Примеров инете полно как работать с сокетами виндовс ........ стартуешь библиотеку создаешь сокет конектишся к серверу..... Скорее всего на порт 80 который у броузера по умолчанию....... А вот что дальше делать.... Я тебе не подскажу ... Я бы посмотрел каким нибудь снифером типа тспвьюва.... Как логинится броузер... И сделал бы имитацию того же....
|
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Как работать с сокетами я знаю. Но вот именно как отправлять POST запросы примеров найти не могу. И вот чтобы была авторизация.
Я еще поясню. Я понимаю, что нужно отправлять через send заголовки и тело POST-запроса. Через аддон httpfox я вижу их в браузере Firefox. Но я не пойму, как связать это потом со вторым запросом. Ведь у браузеров есть куки, сессии, и авторизовавшись я могу работать под своим аккаунтом, а у winsock ведь запросы никак не связаны друг с другом. Это сообщение отредактировал(а) I_Am_Rock - 12.11.2011, 18:09 |
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Вот такой код. Взял из msdn. И оптимизировал под себя. Вместо site.ru на самом деле настоящий.
Почему-то recv сначала присылала байты, а потом нет (возвращает 0) - пишет ConnectionClosed. Странно. Что-нибудь можете сказаться по этому поводу?
|
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Господа я разобрался с этим, но главный вопрос остался не решенным.
Вот в чем разобрался: в коде выше глупая ошибка (вместо \n стоит /n), еще нужно Content-Type и Content-Lenght. Все добавил, все отлично. Теперь recv возвращает ответ, который надо. Но главный вопрос не решен. Как сделать, чтобы следующий запрос (т.е. следующий send) я сделал как авторизованный пользователь? Мое предположение такое: в ответе есть SetCookie: PHPSESSID=большое_число и нужно это как-то "пристегнуть" к следующим SEND'ам. Скажите, я в правильном направлении? Это сообщение отредактировал(а) I_Am_Rock - 12.11.2011, 23:44 |
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Да, все так и есть. Нужно таскать за собой эти куки.
Спасибо всем, вы мне очень помогли. Это сообщение отредактировал(а) I_Am_Rock - 13.11.2011, 00:47 |
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Хотя есть еще вопрос!
А что нельзя сразу последовательно выполнять send, recv, send, recv? Почему-то второй send не отрабатывает. И второй recv получает во второй аргумент какую-то белиберду. |
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
что, никто не знает? (
send'ы абсолютно идентичны. Может быть после первого recv нужно что сделать, выполнить какую-то команду. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Могу предположить, что recv здесь не корректно оформлен. recv получает 1-ый пакет, здесь все нормально recv получает 2-ой пакет, А вот здесь он затирает 1-ый пакет. Так как читает его по тому-же адресу что и 1-ый. Пусть это пример даже из мсдн, он только для демонстрации. Вобще примеры там писали люди далекие от создателей самих функций. Иногда такая фигня проскакивает, диву даешься... |
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Спасибо за ответ, но это не тот код.
Вот код который у меня сейчас. И в котором у меня ошибка. Здесь происходит регистрация (1 send). Отправка нужного запроса (2 send). 3 send такой же как и второй, но recv от него возвращает байтовый мусор, да и сам запрос не производит нужных манипуляций на сайте. Я выделил комментарием // !!! эти send, точнее вызов функции (2 раза). Причем send не возвращает ошибку. Он как бы выполняется. Извините за корявость кода! Я потом приведу его в порядок. Просто сейчас не хочу окончательно запутаться, пока понимаю, что да как)
Это сообщение отредактировал(а) I_Am_Rock - 13.11.2011, 19:00 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
||||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Пусть этот момент вас не смущает.
А здесь я заменил текст запроса, поэтому поменял и content-length на 14. Вот как так может быть! я вызываю функцию sendandrecv два раза, и в первом случае все нормально работает, а во втором - нет. Ну вот как :( Может быть если send более чем 1 раз обращает с тем же заголовком, нужно что делать? Какую-то функцию вызывать? Порядок такой: 1 send для авторизации - норм его recv - норм 2 send к определенной странице - норм его recv - норм 3 такой же send как предыдущий, только с другим текстом - не выполняется на сайте (причем не возвращая SOCKET_ERROR). его recv - возвращает каракули. либо может просто ничего не возвращает и я пытаюсь вывести указатель "ниначто", что так или иначе указывает на ошибку в recv. Это сообщение отредактировал(а) I_Am_Rock - 13.11.2011, 19:47 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
I_Am_Rock, попробуйте для каждого нового POST'а открывать новый коннект.
впринципе это так и должно делаться. |
|||
|
||||
| I_Am_Rock |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 523 Регистрация: 18.1.2008 Репутация: нет Всего: 15 |
Сделал так. Не помогло, уже с ошибкой вылетает программа.
И вот какой момент. Я проставил чуть ли не построчно printf("1") и printf("2") и т.д. И я вот что заметил - программа вылетает именно на этой строке в функции sendandrecv
До этой строки все выполняется, а потом вылетает. Причем именно когда эта функция выполняется во второй раз. Еще поэкспериментировав, я кажется обнаружил, что проблема в том, что второй функция выполняется, когда send и recv предыдущей функции не завершены. и они мешают друг другу Теперь почему-то всегда вторая функция отрабатывает. Это сообщение отредактировал(а) I_Am_Rock - 13.11.2011, 21:55 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |