je0n
28.06.2006, 00:53
Косяки с сокетами и непонятки с пониманием http-запросов
Я пытаюсь выучить winsock. Почти получается, но появилась проблема. У меня стоит апач и я подключаюсь программой которую написал на с++ к нему, т.е. к 127.0.0.1 на 80 порт. Затем делаю GET запрос на получение главной страницы, но в ответ не получаю вообще ничего. Я сначала думал, что проблема в моем запросе, но потом поставил тот же запрос в программу на php (идентичную) и апач вернул сообщение bad request. Мои косяки в запросе подтвердились, но ведь и программа на c++ тогда должна была вернуть это сообщение с “bad request”. А она вообще ничего не вернула. Вот у меня два вопроса.
1) как должен выглядеть минимальный GET запрос? Мой запрос вы увидите дальше по тексту в исходниках программ.
2) почему программа на с++ не получает ответа от сервера.?
Вот исходники тех программ:
C++:
#include <stdio.h>
#include <winsock.h>
#include <windows.h>
int main()
{
WSADATA wsadata;
int s,char_len;
LPSTR str;
struct sockaddr_in addr_c,addr_s;
WSAStartup(MAKEWORD(2,0),&wsadata);
s=socket(AF_INET,SOCK_STREAM,0);
memset((char *)&addr_c,0,sizeof(addr_c));
addr_c.sin_family=AF_INET;
addr_c.sin_port=80;
addr_c.sin_addr.s_addr=INADDR_ANY;
bind(s,(struct sockaddr *)&addr_c,sizeof(addr_c));
memset((char *)&addr_s,0,sizeof(addr_s));
addr_s.sin_family=AF_INET;
addr_s.sin_port=80;
addr_s.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(s,(struct sockaddr *)&addr_s,sizeof(addr_s))==-1)puts("connect error");
str=(LPSTR)GlobalAlloc(GHND,0);
str="GET index.html HTTP/1.1\r\n\r\n";
send(s,str,100,0);
char_len=recv(s,str,1000,0);
puts(str);
puts("end...");
return 0;
}
php:
<?php
$tosend="GET index.html HTTP/1.1\r\n\r\n ";
echo $tosend."<br>";
$s=fsockopen("127.0.0.1",80);
if($s)
{
fwrite($s,$tosend);
$tosend=fread($s,1000);
echo $tosend;
}
?>
Я пытаюсь выучить winsock. Почти получается, но появилась проблема. У меня стоит апач и я подключаюсь программой которую написал на с++ к нему, т.е. к 127.0.0.1 на 80 порт. Затем делаю GET запрос на получение главной страницы, но в ответ не получаю вообще ничего. Я сначала думал, что проблема в моем запросе, но потом поставил тот же запрос в программу на php (идентичную) и апач вернул сообщение bad request. Мои косяки в запросе подтвердились, но ведь и программа на c++ тогда должна была вернуть это сообщение с “bad request”. А она вообще ничего не вернула. Вот у меня два вопроса.
1) как должен выглядеть минимальный GET запрос? Мой запрос вы увидите дальше по тексту в исходниках программ.
2) почему программа на с++ не получает ответа от сервера.?
Вот исходники тех программ:
C++:
#include <stdio.h>
#include <winsock.h>
#include <windows.h>
int main()
{
WSADATA wsadata;
int s,char_len;
LPSTR str;
struct sockaddr_in addr_c,addr_s;
WSAStartup(MAKEWORD(2,0),&wsadata);
s=socket(AF_INET,SOCK_STREAM,0);
memset((char *)&addr_c,0,sizeof(addr_c));
addr_c.sin_family=AF_INET;
addr_c.sin_port=80;
addr_c.sin_addr.s_addr=INADDR_ANY;
bind(s,(struct sockaddr *)&addr_c,sizeof(addr_c));
memset((char *)&addr_s,0,sizeof(addr_s));
addr_s.sin_family=AF_INET;
addr_s.sin_port=80;
addr_s.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(s,(struct sockaddr *)&addr_s,sizeof(addr_s))==-1)puts("connect error");
str=(LPSTR)GlobalAlloc(GHND,0);
str="GET index.html HTTP/1.1\r\n\r\n";
send(s,str,100,0);
char_len=recv(s,str,1000,0);
puts(str);
puts("end...");
return 0;
}
php:
<?php
$tosend="GET index.html HTTP/1.1\r\n\r\n ";
echo $tosend."<br>";
$s=fsockopen("127.0.0.1",80);
if($s)
{
fwrite($s,$tosend);
$tosend=fread($s,1000);
echo $tosend;
}
?>