может поможет кто ?
От: Фока  
Дата: 16.05.02 05:26
Оценка:
Пишу клиента НТТР вот краткий код

#include <winsock.h>

BOOL Connect()
{
CString host_http += "www.aaanet.ru";
UINT a;
SOCKET s;
char sz1[0x8000], sz2[0x8000];
WSADATA wsaData;
ULONG ulAddress;
SOCKADDR_IN sin;

//== инициализация winsock
if (WSAStartup(MAKEWORD(1, 1), &wsaData))
{
WSACleanup();
return 0;
}


//== открыть сокет
s = socket(AF_INET, SOCK_STREAM, NULL);
if (s == INVALID_SOCKET)
{
closesocket(s);
WSACleanup();
return 0;
}

//== получить данные о сервере
ulAddress = inet_addr(host_http);
if (ulAddress == INADDR_NONE)
{
HOSTENT *ptrHost;
ptrHost = gethostbyname(host_http);

if (!ptrHost)
{
closesocket(s);
WSACleanup();
return 0;
}

memcpy(&sin.sin_addr, ptrHost->h_addr_list[0], sizeof(IN_ADDR));

}
else
{
memcpy(&sin.sin_addr, &ulAddress, 4);
};

sin.sin_family = AF_INET;
sin.sin_port = htons(80);

//== установить соединение с сервером
printer("To connect server.", 1);
if (connect(s, (PSOCKADDR)&sin, sizeof(SOCKADDR)))
{
closesocket(s);
WSACleanup();
return 0;
}

a = recv(s, sz1, sizeof(sz1), NULL);

if (a == SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
printer("Socket error.", 1);
return 0;
}
sz1[a] = 0;
printer(sz1);
}

проблема в том чтоя не могу получить данные из сокета.
agilero
Re: может поможет кто ?
От: Maslovsky  
Дата: 16.05.02 08:45
Оценка:
Здравствуйте Фока, Вы писали:

Ф>Пишу клиента НТТР вот краткий код


HTTP протокл то изучил прежде чем клиента писать?

Ф>проблема в том чтоя не могу получить данные из сокета.


Дык что получать то собрался? Ружно сначала спросить, что тебе нужно, тогда и получишь ответ. Например:

...
strcpy(sz1, "GET\n\n");

a = send(s, sz1, strlen(sz1), NULL);
a = recv(s, sz1, sizeof(sz1), NULL); 
..
Удачи,
Антон
Re[2]: может поможет кто ?
От: Фока  
Дата: 16.05.02 11:20
Оценка:
Здравствуйте Maslovsky, Вы писали:

M>Здравствуйте Фока, Вы писали:


Ф>>Пишу клиента НТТР вот краткий код


M>HTTP протокл то изучил прежде чем клиента писать?


Ф>>проблема в том чтоя не могу получить данные из сокета.


M>Дык что получать то собрался? Ружно сначала спросить, что тебе нужно, тогда и получишь ответ. Например:


M>
M>...
M>strcpy(sz1, "GET\n\n");

M>a = send(s, sz1, strlen(sz1), NULL);
M>a = recv(s, sz1, sizeof(sz1), NULL); 
M>..
M>


писал ни чего не получается

strcpy(sz1, "GET\n\n");
a = send(s, sz1, strlen(sz1), NULL);
strcpy(sz1, "/index.html\n\n");
a = send(s, sz1, strlen(sz1), NULL);
strcpy(sz1, "HTTP/1.1\n\nAccept: */*\n\nAccept-Language: ru\n\nAccept-Encoding: gzip, deflate\n\nMozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)\n\n");
a = send(s, sz1, strlen(sz1), NULL);
a = recv(s, sz1, sizeof(sz1), NULL);
agilero
Re[3]: может поможет кто ?
От: Vamp Россия  
Дата: 16.05.02 12:30
Оценка:
Здравствуйте Фока, Вы писали:


Ф> strcpy(sz1, "GET\n\n");

Ф> a = send(s, sz1, strlen(sz1), NULL);
Ф> strcpy(sz1, "/index.html\n\n");
Ф> a = send(s, sz1, strlen(sz1), NULL);
Ф> strcpy(sz1, "HTTP/1.1\n\nAccept: */*\n\nAccept-Language: ru\n\nAccept-Encoding: gzip, deflate\n\nMozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)\n\n");
Ф> a = send(s, sz1, strlen(sz1), NULL);
Ф> a = recv(s, sz1, sizeof(sz1), NULL);

Мне, к примеру, попадались такие хитрые сервера, которым было надо не просто
\n
, а
\r\n
.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: может поможет кто ?
От: flyker Россия  
Дата: 16.05.02 12:50
Оценка:
Здравствуйте Фока, Вы писали:

Ф>Здравствуйте Maslovsky, Вы писали:


M>>Здравствуйте Фока, Вы писали:


Ф>>>Пишу клиента НТТР вот краткий код


M>>HTTP протокл то изучил прежде чем клиента писать?


Ф>>>проблема в том чтоя не могу получить данные из сокета.


M>>Дык что получать то собрался? Ружно сначала спросить, что тебе нужно, тогда и получишь ответ. Например:


M>>
M>>...
M>>strcpy(sz1, "GET\n\n");

M>>a = send(s, sz1, strlen(sz1), NULL);
M>>a = recv(s, sz1, sizeof(sz1), NULL); 
M>>..
M>>


Ф>писал ни чего не получается


Ф> strcpy(sz1, "GET\n\n");

Ф> a = send(s, sz1, strlen(sz1), NULL);
Ф> strcpy(sz1, "/index.html\n\n");
Ф> a = send(s, sz1, strlen(sz1), NULL);
Ф> strcpy(sz1, "HTTP/1.1\n\nAccept: */*\n\nAccept-Language: ru\n\nAccept-Encoding: gzip, deflate\n\nMozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)\n\n");
Ф> a = send(s, sz1, strlen(sz1), NULL);
Ф> a = recv(s, sz1, sizeof(sz1), NULL);

Стандартный перевод строки не "\n\n" а "\r\n" так называемый CRCF

а писать надо так

struct sockaddr_in Addr;
struct hostent *Host = gethostbyname("www.zzz.qqq");
if( Host == NULL ) return;
Addr.sin_addr.s_addr = *((unsigned long *) Host->h_addr);
Addr.sin_family = AF_INET;
int sock = socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_port = fhtons(80);    
if( connect(sock, (struct sockaddr *)&Addr, sizeof(Addr)) ) return;
if( send(sock, "GET\r\n", 5, 0) == SOCKET_ERROR ) return;
char buf[1024];
if( recv(sock, buf, sizeof(buf), 0) == SOCKET_ERROR ) return;
Все гениальное — просто
Re[4]: может поможет кто ?
От: flyker Россия  
Дата: 16.05.02 12:54
Оценка:
V>Мне, к примеру, попадались такие хитрые сервера, которым было надо не просто
\n
, а
\r\n
.


Хитрые — это те которые умеют понимать только "\n"
А нормальные такого безобразия не потерпят
Все гениальное — просто
Re[4]: может поможет кто ?
От: NavuhodonosoR Россия  
Дата: 17.05.02 06:31
Оценка:
Здравствуйте flyker, Вы писали:

F>Здравствуйте Фока, Вы писали:


Ф>>Здравствуйте Maslovsky, Вы писали:


M>>>Здравствуйте Фока, Вы писали:


Ф>>>>Пишу клиента НТТР вот краткий код


M>>>HTTP протокл то изучил прежде чем клиента писать?


F>Стандартный перевод строки не "\n\n" а "\r\n" так называемый CRCF


F>а писать надо так


F>
F>struct sockaddr_in Addr;
F>struct hostent *Host = gethostbyname("www.zzz.qqq");
F>if( Host == NULL ) return;
F>Addr.sin_addr.s_addr = *((unsigned long *) Host->h_addr);
F>Addr.sin_family = AF_INET;
F>int sock = socket(AF_INET, SOCK_STREAM, 0);
F>Addr.sin_port = fhtons(80);    
F>if( connect(sock, (struct sockaddr *)&Addr, sizeof(Addr)) ) return;
F>if( send(sock, "GET\r\n", 5, 0) == SOCKET_ERROR ) return;
F>char buf[1024];
F>if( recv(sock, buf, sizeof(buf), 0) == SOCKET_ERROR ) return;
F>


"Или что-то случилось, или одно из двух" (с) Колобки
Господа! А вы не пробовали все-таки прочитать RFC?
HTTP Request = Request-line CRLF
               [*message-header CRLF]
               CRLF
               ...
Request-line = Method SP URI SP HTTP/1.1


То есть делать надо так:
...
if( connect(sock, (struct sockaddr *)&Addr, sizeof(Addr)) ) return; 
if( send(sock, "GET /index.html HTTP/1.1\r\nHost:www.zzz.qqq\r\n\r\n", 46, 0) == SOCKET_ERROR ) return;
//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
char buf[1024];
if( recv(sock, buf, sizeof(buf), 0) == SOCKET_ERROR ) return;


И Host надо указывать обязательно, без этого message-header велик шанс получит в ответ Bad Request (IIS проглатывает, проверено)

Кстати, а что это за строка у Фоки: "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"?
Если это User-Agent, то так делать не хорошо (хотя и можно). По RFC этот message-header служит для ловли багов.
Re[5]: может поможет кто ?
От: flyker Россия  
Дата: 17.05.02 07:16
Оценка:
Здравствуйте NavuhodonosoR, Вы писали:

NR>Здравствуйте flyker, Вы писали:


F>>Здравствуйте Фока, Вы писали:


Ф>>>Здравствуйте Maslovsky, Вы писали:


M>>>>Здравствуйте Фока, Вы писали:


Ф>>>>>Пишу клиента НТТР вот краткий код


M>>>>HTTP протокл то изучил прежде чем клиента писать?


F>>Стандартный перевод строки не "\n\n" а "\r\n" так называемый CRCF


F>>а писать надо так


F>>
F>>struct sockaddr_in Addr;
F>>struct hostent *Host = gethostbyname("www.zzz.qqq");
F>>if( Host == NULL ) return;
F>>Addr.sin_addr.s_addr = *((unsigned long *) Host->h_addr);
F>>Addr.sin_family = AF_INET;
F>>int sock = socket(AF_INET, SOCK_STREAM, 0);
F>>Addr.sin_port = fhtons(80);    
F>>if( connect(sock, (struct sockaddr *)&Addr, sizeof(Addr)) ) return;
F>>if( send(sock, "GET\r\n", 5, 0) == SOCKET_ERROR ) return;
F>>char buf[1024];
F>>if( recv(sock, buf, sizeof(buf), 0) == SOCKET_ERROR ) return;
F>>


NR>"Или что-то случилось, или одно из двух" (с) Колобки

NR>Господа! А вы не пробовали все-таки прочитать RFC?
NR>
NR>HTTP Request = Request-line CRLF
NR>               [*message-header CRLF]
NR>               CRLF
NR>               ...
NR>Request-line = Method SP URI SP HTTP/1.1
NR>


NR>То есть делать надо так:

NR>
NR>...
NR>if( connect(sock, (struct sockaddr *)&Addr, sizeof(Addr)) ) return; 
NR>if( send(sock, "GET /index.html HTTP/1.1\r\nHost:www.zzz.qqq\r\n\r\n", 46, 0) == SOCKET_ERROR ) return;
NR>//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
NR>char buf[1024];
NR>if( recv(sock, buf, sizeof(buf), 0) == SOCKET_ERROR ) return;
NR>


NR>И Host надо указывать обязательно, без этого message-header велик шанс получит в ответ Bad Request (IIS проглатывает, проверено)


NR>Кстати, а что это за строка у Фоки: "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"?

NR>Если это User-Agent, то так делать не хорошо (хотя и можно). По RFC этот message-header служит для ловли багов.

На простой GET без параметров сервер тоже как-нибудь ответит
А вдаваться в подробности протокола я не стал, потому что человеку нужно было
чтобы сервер ему хоть что-то ответил.
Все гениальное — просто
Re[6]: может поможет кто ?
От: Аноним  
Дата: 17.05.02 07:22
Оценка:
Здравствуйте flyker, Вы писали:

F>На простой GET без параметров сервер тоже как-нибудь ответит


А можно ткнуть пальцем в то место RFC, где это написано? :no:
Re[5]: может поможет кто ?
От: Maslovsky  
Дата: 17.05.02 07:28
Оценка:
Здравствуйте NavuhodonosoR, Вы писали:

NR>Кстати, а что это за строка у Фоки: "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"?

NR>Если это User-Agent, то так делать не хорошо (хотя и можно). По RFC этот message-header служит для ловли багов.

Все правильно, токо суьть моего ответа была в том, что человек пытался читать из сокета, ничего предварительно не спросив. А уж как он формирует запрос — проблемя следующая.
Удачи,
Антон
Re[7]: может поможет кто ?
От: NavuhodonosoR Россия  
Дата: 17.05.02 07:42
Оценка:
А>Здравствуйте flyker, Вы писали:

F>>На простой GET без параметров сервер тоже как-нибудь ответит

А>А можно ткнуть пальцем в то место RFC, где это написано?

Только что проверил — IIS шлет "400 Bad Request" в ответ на GET\r\n\r\n.
Плохой способ проверять связь с сервером. И не самый лучший ответ на вопрос — человек не просто хочет получить ответ от сервера, он хочет получить "200 OK".

Кстати, Аноним — это я
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.