winsock http response
От: crawler  
Дата: 27.02.09 11:17
Оценка:
Добрый день,

Необходимо обработать запрос приходящий с браузера, использую winsock

char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";
ret = send(sock,response,DEFAULT_BUFFER,0);

В спецификации по HTTP 1.1:

Response = Status-Line ;
*(( general-header ;
| response-header ;
| entity-header ) CRLF) ;
CRLF
[ message-body ] ;


что не нравится браузеру ...

Подскажите пожалуйста в чем может быть ошибка или где можно прочитать...

Заранее спасибо



27.02.09 15:34: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: winsock http response
От: MaxGl Украина  
Дата: 27.02.09 11:28
Оценка:
Здравствуйте, crawler, Вы писали:

C>Добрый день,


C>что не нравится браузеру ...

А что браузер пишет?
Re[2]: winsock http response
От: MaxGl Украина  
Дата: 27.02.09 11:36
Оценка:
Здравствуйте, MaxGl, Вы писали:

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


C>>Добрый день,


C>>что не нравится браузеру ...

MG>А что браузер пишет?
Может тут проблема?
RFC2616

Transfer-Encoding MUST be used to indicate any transfer-codings applied by an application to ensure safe and proper transfer of the message. Transfer-Encoding is a property of the message, not of the

entity, and thus MAY be added or removed by any application along the request/response chain. (However, section 3.6 places restrictions on when certain transfer-codings may be used.)

The rules for when a message-body is allowed in a message differ for requests and responses.

The presence of a message-body in a request is signaled by the inclusion of a Content-Length or Transfer-Encoding header field in the request's message-headers. A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests. A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.

Re[2]: winsock http response
От: crawler  
Дата: 27.02.09 11:41
Оценка:
Здравствуйте, MaxGl, Вы писали:

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


C>>Добрый день,


C>>что не нравится браузеру ...

MG>А что браузер пишет?


Hallo %s%s%s��RECIEVED: ������ ���%s��SOCKET ERROR �����accept socket FAILED��������FAILED bind() �����%s%s����ERROR !!! �����WINSOCKET ERROR !!! �������127.0.0.1���c�r�t�e�x�e�.�c�������������_�_�n�a�t�i�v�e�_�s�t�a�r�t�u�p�_�s�t�a�t�e� �=�=� �_�_�i�n�i�t�i�a�l�i�z�e�d����������

Ну в общем что-то тут не так .... Это из дебага естественно, по этому видимо и цепляет обработки ошибок SOCKET ERROR, FAILED bind()....
Re: winsock http response
От: MaxGl Украина  
Дата: 27.02.09 12:03
Оценка: 4 (1)
Здравствуйте, crawler, Вы писали:


C>char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";

C> ret = send(sock,response,DEFAULT_BUFFER,0);

А чему равно DEFAULT_BUFFER?

В данном случае надо так:
ret = send(sock,response, strlen(response),0);
Re[2]: winsock http response
От: crawler  
Дата: 27.02.09 12:12
Оценка:
Здравствуйте, MaxGl, Вы писали:

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



C>>char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";

C>> ret = send(sock,response,DEFAULT_BUFFER,0);

MG> А чему равно DEFAULT_BUFFER?


MG>В данном случае надо так:

MG>
MG>ret = send(sock,response, strlen(response),0);
MG>



Не поверишь я со вчерашней ночи по всякому пробовал

char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html Content-Length:200 \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";
ret = send(sock,response,strlen(response)+1,0);


И с длинами в Content-Length: по разному ....

Боюсь что здесь ошибка в чем-то другом ...

может CR LF последовательность не \r\n а как-то по другому должна быть ?

Например, IE вообще циклится он мне продолжает GET запросы сыпать... с такими же ошибками
Re[3]: winsock http response
От: MaxGl Украина  
Дата: 27.02.09 12:23
Оценка: 4 (1)
Здравствуйте, crawler, Вы писали:

C>Не поверишь я со вчерашней ночи по всякому пробовал


C>char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html Content-Length:200 \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";

C>ret = send(sock,response,strlen(response)+1,0);
Кхэ-кхэ . Это что за самодеятельность?
char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html Content-Length:200 \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";


RFC2616

When a Content-Length is given in a message where a message-body is
allowed, its field value MUST exactly match the number of OCTETs in
the message-body. HTTP/1.1 user agents MUST notify the user when an
invalid length is received and detected.


C>Боюсь что здесь ошибка в чем-то другом ...

Почитай внимательно RFC2616:
раздел 4.3 Message Body и раздел 4.4 Message Length
C>может CR LF последовательность не \r\n а как-то по другому должна быть ?
Тут все правильно у тебя.
Re[3]: winsock http response
От: MaxGl Украина  
Дата: 27.02.09 12:32
Оценка:
Здравствуйте, crawler, Вы писали:
C>char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html Content-Length:200 \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";
Я сразу не заметил...
RFC2616

generic-message = start-line
*(message-header CRLF)
CRLF
[ message-body ]
start-line = Request-Line | Status-Line

Из чего следует, что каждый хэдэр должен находится своей строке. У тебя два хэдэра в одной строке получились.

C>Не поверишь я со вчерашней ночи по всякому пробовал

Спать по ночам надо
Re[4]: winsock http response
От: crawler  
Дата: 27.02.09 12:48
Оценка:
Здравствуйте, MaxGl, Вы писали:

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

C>>char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html Content-Length:200 \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";
MG>Я сразу не заметил...
MG>RFC2616

MG>

MG>generic-message = start-line
MG> *(message-header CRLF)
MG> CRLF
MG> [ message-body ]
MG> start-line = Request-Line | Status-Line

MG>Из чего следует, что каждый хэдэр должен находится своей строке. У тебя два хэдэра в одной строке получились.

C>>Не поверишь я со вчерашней ночи по всякому пробовал

MG>Спать по ночам надо


Спасибо за помощь щас попробую внимательно вчитаться
Re: winsock http response
От: ilnar Россия  
Дата: 27.02.09 13:33
Оценка: +1
Здравствуйте, crawler, Вы писали:

C>Добрый день,


C>Необходимо обработать запрос приходящий с браузера, использую winsock


C>char* response = "HTTP/1.1 200 OK \r\n Content-Type:text/html \r\n\r\n <HTML>\n<BODY>\nHallo\n</BODY>\n</HTML> \r\n";

C>ret = send(sock,response,DEFAULT_BUFFER,0);

C>В спецификации по HTTP 1.1:


C> Response = Status-Line ;

C> *(( general-header ;
C> | response-header ;
C> | entity-header ) CRLF) ;
C> CRLF
C> [ message-body ] ;


C>что не нравится браузеру ...


C>Подскажите пожалуйста в чем может быть ошибка или где можно прочитать...


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

ну и еще проблема которую уже озвучили, надо send(sock,response,strlen(response),0);


C>Заранее спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.