Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формирование Get запроса в Unix, неверный ответ. Подскажите где ошибка. 
:(
    Опции темы
Damp1L
Дата 30.1.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Просто создаю сокет, отправляю запрос и ответ пишу в файл. Собирал под  Linux 2.6.8. Делаю такой-же запрос в Borland c++ ответ нормальный, а так ответ такой примерно:
[quote]
 Ґ@HTTP/1.1 404 Not Found
Date: Tue, 30 Jan 2007 14:42:19 GMT
Server: Apache
Connection: close
Content-Type: text/html


(none)
<!--

-->
X.@фЂend
[quote]
Думаю тут какая-то проблема в неверном формировании, зарание спасибо. Вот код сам:
Код

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main()
{
    char buf[1500], com[1500];
    printf("start\n");
    char szUrl[]="http://www.rsdn.ru/article/unix/sockets.xml";
    char host[]="www.rsdn.ru";
    sprintf(com,"GET /article/unix/sockets.xml HTTP/1.1\r\nAccept: text/html,*/*\r\nAccept-Language: ru\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\nHost: %s\r\nReferer: google.ru\r\n\r\n",host);
    printf(com);
    int sock;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        printf("socket error");
        exit(1);
    }
    char *ip = gethostbyname(host);
    bzero(&addr, sizeof(struct sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    addr.sin_addr.s_addr = htonl(ip);
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        printf("connect error");
        exit(2);
    }
    printf("=================================================\n");
    send(sock, com, strlen(com), 0);
    
  int i;
  while(recv(sock,buf+strlen(buf),255,0)>0);
   // recv(sock, buf, 1500, 0);
    printf(buf);
    close(sock);
      FILE *fp;
      fp = fopen("list.txt","w");
      fprintf(fp,"%s",buf);
      fclose(fp);
    printf("end");
    return 0;
}


Это сообщение отредактировал(а) Damp1L - 31.1.2007, 15:45
PM MAIL   Вверх
ptr
Дата 30.1.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Код

sprintf(com,"GET http://%s HTTP/1.0\nAccept: text/html,*/*\nAccept-Language: ru\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\nHost: %s\nReferer: google.ru\n\n", szUrl,host);

Здесь нужно \n заменить на \r\n.

Код

while(i = recv(sock,buf+strlen(buf),1000,0));

1. Интересно чему же равна длина строки? Первоначально неплохо было бы занулить buf, ну и ещё recv не дописывает заключающий ноль.
2. Не нравится мне этот цикл. Во-первых, возможно переполнение буфера. Во-вторых, а если произошла ошибка (-1)? Вообщем нехороший цикл.

Код

fp = fopen("list.txt","w");

А закрывать кто будет?


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Damp1L
Дата 30.1.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Да, тут есть ошибки, но не в том, просто код писался на скорую руку. Даже при этих ошибках сервер не должен давать 404 код сам посуди. /n и /r/n дают одинаковый результат, уже пробывал
PM MAIL   Вверх
jonie
Дата 31.1.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



Цитата

А закрывать кто будет?
ОСь? современные ОС должны закрыть все открытые дескрипторы, сколь мне изветно...) но это я так.. ответ на вопрос) ни коим образом такое не приветсвую.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ptr
Дата 31.1.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Код

GET /article/unix/sockets.xml HTTP/1.0
...
Host: www.rsdn.ru
...


Цитата(Damp1L @  30.1.2007,  22:14 Найти цитируемый пост)
 /n и /r/n дают одинаковый результат, уже пробывал

В данном случае эксперимент не является подтвеждение факта. "Видишь сурка? Нет. А он есть". smile На части серверов это будет работать, на другой нет.
Если ты внимательно почитаешь спецификацию HTTP, то увидишь там такое интересное сокращение <CRLF> - перевод строки. Так вот CR - "\r", LF - "\n".

Цитата(jonie @  31.1.2007,  04:34 Найти цитируемый пост)
ОСь? современные ОС должны закрыть все открытые дескрипторы, сколь мне изветно...) но это я так.. ответ на вопрос) ни коим образом такое не приветсвую.

Ну да ОС закроет все дескрипторы, освободит все ресурсы, в случае, когда процесс помрёт. А до этого?

Цитата(Damp1L @  30.1.2007,  22:14 Найти цитируемый пост)
Даже при этих ошибках сервер не должен давать 404 код сам посуди.

Правильно заданный вопрос - половина ответа.


Это сообщение отредактировал(а) ptr - 31.1.2007, 12:31


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Damp1L
Дата 31.1.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Такс.. всё что сказали вроде поправил, но ошабка так и идёт.. на всех серверах, почему хз =(
PM MAIL   Вверх
ptr
Дата 31.1.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Показывай код.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Damp1L
Дата 31.1.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



поправил в первом посте =)
PM MAIL   Вверх
ptr
Дата 1.2.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Код

char *ip = gethostbyname(host);
...
addr.sin_addr.s_addr = htonl(ip);

И этот код компилируется? gethostbyname возвращает указатель на hostent.  И уже оттуда надо брать ip адрес хоста. А у тебя получается, что ты подключаешься не туда куда хотел.

И переделай нормально цикл.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Damp1L
Дата 1.2.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Спасиб, да ошибка оказалась там где ты показал =) Исправил =) на 
Код

struct hostent *Ip = gethostbyname(host);
...
addr.sin_addr.s_addr =inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));


Добавлено @ 20:16 
И как нормально-то переделать цикл ? Попробывал, ничего на ум не приходит пока =)
PM MAIL   Вверх
ptr
Дата 2.2.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Например так:
Код

    const int BUF_SIZE=255;

    char buf[BUF_SIZE+1]={0};
    int retVal=0;

    while(true)
    {
        retVal=recv(sock, buf, BUF_SIZE, 0);
        if(-1==retVal)
        {
            printf("Error - %s\n", strerror(errno));
            break;
        }
        if(0==retVal)
        {
            printf("Remote side has closed the connection\n");
            break;
        }
        buf[retVal]='\0';
        fprintf(fp, "%s", buf);
      }



--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.