Отправка GET/POST-запроса средствами чистого C++

1,00
р.
Как реализовать простой GET/POST запрос без использования сторонних библиотек?
Нашел много примеров, но там либо cpp-netlib, либо curl, а мне бы хотелось самому все это написать, но с сетью в С++ не работал, только через Qt. Было бы очень здорово увидеть маленький работающий пример :)

Ответ
Я решил проблему так:
#include #include #include #include #include #include #include #include #include #include #include #include #include
char http[]={"http://"} char host[]={"localhost"} char parm[]={"/api/method.php"}
std::string getProtocol( std::string url ) { std::string protocol = ""
int i = 0
for(i = 0 i < url.size() i++) { if( url[i] != '/' || url[i+1] != '/' ) { protocol += url[i] } else { protocol += "//" break } }
return protocol }
std::string getHost( std::string url ) { std::string host = ""
url.replace(0, getProtocol(url).size(), "")
int i = 0 for(i = 0 i < url.size() i++) {
if( url[i] != '/' ) { host += url[i] } else { break }
}
return host }
std::string getAction( std::string url ) { std::string parm = ""
url.replace(0, getProtocol(url).size()+getHost(url).size(), "")
int i = 0 for(i = 0 i < url.size() i++) {
if( url[i] != '?' && url[i] != '#' ) { parm += url[i] } else { break }
}
return parm }
std::string getParams( std::vector< std::pair< std::string, std::string> > requestData ) { std::string parm = ""
std::vector< std::pair< std::string, std::string> >::iterator itr = requestData.begin()
for( itr != requestData.end() ++itr ) { if( parm.size() < 1 ) { parm += "" } else { parm += "&" } parm += itr->first + "=" + itr->second }
return parm }
std::string GET( std::string url, std::vector< std::pair< std::string, std::string> > requestData ) { std::string http = getProtocol(url) std::string host = getHost(url) std::string script = getAction(url) std::string parm = getParams( requestData )
char buf[1024]
std::string header = ""
header += "GET " header += http + host + script + "?" + parm header += (std::string)" HTTP/1.1" + "
" header += (std::string)"Host: " + http + host + "/" + "
" header += (std::string)"User-Agent: Mozilla/5.0" + "
" //header += (std::string)"Accept: text/html" + "
" header += (std::string)"Accept-Language: ru,en-us q=0.7,en q=0.3" + "
" header += (std::string)"Accept-Charset: windows-1251,utf-8 q=0.7,* q=0.7" + "
" header += (std::string)"Connection: keep-alive " + "
" header += "
"

int sock struct sockaddr_in addr struct hostent* raw_host raw_host = gethostbyname( host.c_str() ) if (raw_host == NULL) { std::cout<<"ERROR, no such host" exit(0) }<br> sock = socket(AF_INET, SOCK_STREAM, 0)
addr.sin_family = AF_INET addr.sin_port = htons(80)
bcopy( (char*)raw_host->h_addr, (char*)&addr.sin_addr, raw_host->h_length )
if( connect( sock, (struct sockaddr *)&addr, sizeof(addr) ) < 0) { std::cerr<<"connect error"<<std::endl exit(2) }<br> char * message = new char[ header.size() ] for(int i = 0 i < header.size() i++) { message[i] = header[i] }
send(sock, message, header.size(), 0) recv(sock, buf, sizeof(buf), 0)
std::string answer = ""
for(int j = 0 j < 1024 j++) { answer += buf[j] }
return answer
}