LINUX.ORG.RU

http запрос в C


0

0

Как сделать субж? Т.е есть сервак www.myhost.com, надо сделать запрос к скрипту на сервере на Си. Делаю так: Формирую заголовок якобы мозиллы Ну и собсно запрос к cgi скрипту;

int main(int argc, char **argv) {

char post[]="POST /mypath/my.cgi HTTP/1.1 Host: www.myhost.com\r\n\r\n User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1 Accept-Language: en-us, en;q=0.50 Accept-Encoding: gzip, deflate, compress;q=0.9 Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66 Keep-Alive: 300 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 43

username=myname&email=myemail&color=%FFFFFF"

....... send (socket, post, sizeof(post), 0); ......... }

Видимо не в правильных местах стоят CRLF но читая доку по HTTP так и не могу подобрать правильное положение... В С я не очень силён... CR=\r and LF=\n или нет? Сервак возвращает что или запрос неверный или еще какую нить ерунду про ошибки...

anonymous

А чёрт! Форматирования текста не было :( Вторая попытка.

int main(int argc, char **argv) {

char post[]="POST /mypath/my.cgi HTTP/1.1
Host: www.myhost.com\r\n\r\n
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1
Accept-Language: en-us, en;q=0.50
Accept-Encoding: gzip, deflate, compress;q=0.9
Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded Content-Length: 43

username=myname&email=myemail&color=%FFFFFF"

.......
send (socket, post, sizeof(post), 0);
......... }

anonymous
()

Вечно сёй пришибленные шугают до приключений на собственную задницу. Гораздо юниксячей было бы из того же Цэ (и на фига он вообще нужен?) popen-уть за тот же wget.

Antichrist
()

Помоему ты перепутал CR=\n ,а LF=\r. Поточнее узнай что в каких местах должно стоять, и вообще присоединись к 80 порту хоста телнетом и слей все это ему, а потом посмотри че он скажет, можешь из того-же Си с помощью printf слить все в файл, чтобы CR LF сохранить( а то как руками их вобьешь?), и вставить в телнет, надеюсь ты понял мой бред 8-). огу помочь с программированием xidden@mail.ru

OxiD ★★★★
()

нет, у него правильно -- CR=\r LF=\n

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

А ты не понял? Лечись эвтаназией. Повторяю для тупых - popen("wget...",..."), и не еби себе мозги. Потому как бывает и прокси, и всё такое прочее, да и вообще юних-вэй - это кошерно.

Antichrist
()
Ответ на: комментарий от anonymous

Во первых, LRNF'ы должны стоять: - В конце первой строки ( которая METHOD URL PROTOCOL ) - В конце каждой пары Name=Value

Кроме того:

char post[]="POST /mypath/my.cgi HTTP/1.1 Host: www.myhost.com\r\n\r\n ^^^^^^^^^ Двойной LRNF обозначает конец HTTP header'а.

P.S. Антихруст: Рот закрой.

omerm
()
Ответ на: комментарий от omerm

Сам заткнись. Если ты сейчас начнёшь человека грузить, что ему и с проксёй надо самостоятельно работать - то ты просто садист, и тебя от общества изолировать надо. Будешь сидеть в дурке и программить под виндовз, а юних вэй требует реюза полного.

Antichrist
()

Пасиба всем за ответы :) Я придумал как выяснить где должны стоять CRLF - пишется простейшая прога которая слушает на 80м порту, пишется хтмл страница генерящая нужный запрос, открывается в мозилке и шлет запрос этой проге. Она записывает принятое в файл который потом и изучается. Сделаю как тока появится время.

PS. Не знаю как бы это не интерпретировалось но нужно слать все тки CR = <US-ASCII CR, carriage return (13)> LF = <US-ASCII LF, linefeed (10)>

PPS. Антихрист закрой пасть козёл. :)

anonymous
()

> а юних вэй требует реюза полного

И эти люди запрещают мне пользоваться Kylix'ом, где этот самый реюз доведёт просто до экстремальных размеров!

anonymous
()

По поводу реюза ;) Это с freshmeat.net
EXACT MATCH:
libwww
General-purpose client side Web API written in C for Unix
and Windows (Win32)

anonymous
()
Ответ на: комментарий от anonymous

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

Antichrist
()
Ответ на: комментарий от Antichrist


2 Antichrist
:))

Дело в том что для того чтобы чел понял бы чем хорош wget надо бы
чтобы чел понял суть задачи.
Поясню. Чел не знает как выглядит где ставить какие пробелы в ХТТП
заголовке. То есть он думает что он этого не знает, а на самом деле
он не знает другого - что такое ХТТП запрос, как он выглядит и зачем
он это делает. И насколько это левое дело руками ХТТП прописывать.

Привести человека к правильной постановке вопроса - уже немало. Ибо
wget - ответ на вопрос "Как обращатся к серверу без диких напильников", а не "Как работать с ХТТП протоколом".

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

просто садист, или не просто - вопрос иной области определения.
А вот реюз - дело опасное. Он с переносимостью в ссоре:(((

omerm
()
Ответ на: комментарий от anonymous

Ну, молодец раз придумал. Тока лучше бы ты придумал:
А. Прогу не писать, а скачать сниффер.
Б. Файл не изучать а поискать нужный РФС
В. Ввиду пункта Б. сниффер не скачивать.

omerm
()
Ответ на: комментарий от OxiD


>> вообще присоединись к 80 порту хоста телнетом и слей все это ему,
>> а потом посмотри че он скажет
Молодой человек, вы стандарты читать не советуете из принципа?

>> то как руками их вобьешь
Ctl-V Ctl-M Ctl-V Ctl-J спасет отца русской демократии.

omerm
()

char post[]="POST /mypath/my.cgi HTTP/1.1\r
Host: www.myhost.com\r
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722\r
Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain ;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r
Accept-Language: en-us, en;q=0.50\r
Accept-Encoding: gzip, deflate, compress;q=0.9\r
Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r
Keep-Alive: 300\r
Connection: keep-alive\r
Content-Type: application/x-www-form-urlencoded\r
Content-Length: 43\r
\r
username=myname&email=myemail&color=%FFFFFF";

Вот так точно будет работать :)
Но ты наверное уже разобрался %)

romd
()

Послалось в одном месте не совсем правильно - после text/plain не должно быть новой строки, должна быть одна строка до Accept-Language:

romd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.