Эксперт
- Статус
- Оффлайн
- Регистрация
- 12 Июн 2014
- Сообщения
- 994
- Реакции
- 1,209
вполне работоспособный кусок из моего стародавнего проекта.
Вырезал все навесные методы, оставив только основную(очень упрощенную) рабочию часть.
В коде умышленно допущен "недочет"(не влияющий на общию работоспособность), дабы был)))
.h
.cpp
Использовать так:
php:
С++:
Результат:
Вырезал все навесные методы, оставив только основную(очень упрощенную) рабочию часть.
В коде умышленно допущен "недочет"(не влияющий на общию работоспособность), дабы был)))
.h
Код:
#pragma once
#include <windows.h>
#include<string>
#pragma comment(lib, "ws2_32.lib")
enum eQueryType:
int
{
ePOST,
eGET
};
class cWinSoket
{
public:
cWinSoket(const std::string& szHost);
virtual ~cWinSoket();
bool Connect();
bool Send(eQueryType type,std::string path, std::string query);
bool Recv(char *buf, int len);
std::string getBody(char *buf) {
std::string temp = "";
for (int i = 0; buf[i] != 0; ++i){
if ((buf[i] == '\r') && (buf[i + 1] == '\n') &&
(buf[i + 2] == '\r') && (buf[i + 3] == '\n')){
temp = (char*)&buf[i] + 4;
break;
}
}
return temp;
}
private:
SOCKET Socket;
std::string szHost;
std::string szUserAgent;
};
.cpp
Код:
#include "cWinSoket.h"
cWinSoket::cWinSoket(const std::string& szHost):
szHost(szHost),
Socket(INVALID_SOCKET),
szUserAgent("def:Agent")
{
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
}
bool cWinSoket::Connect() {
this->Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (this->Socket == INVALID_SOCKET) {
printf_s("Error::socket: %d\n", WSAGetLastError());
return false;
}
hostent *host = gethostbyname(this->szHost.data());
if (!host){
printf_s("Error: gethostbyname %s\n", this->szHost.data());
return false;
}
sockaddr_in addr_object;
addr_object.sin_family = AF_INET;
addr_object.sin_port = htons(80);
addr_object.sin_addr.s_addr = *(ULONG *)host->h_addr;
if (connect(this->Socket, (sockaddr *)&addr_object, sizeof(addr_object)) == SOCKET_ERROR){
printf_s("Error::connect: %d\n", WSAGetLastError());
return false;
}
return true;
}
bool cWinSoket::Send(eQueryType type, std::string path, std::string query)
{
std::string header;
if (type == eQueryType::ePOST)
header += "POST " + path + " HTTP/1.1\r\n";
else
header += "GET " + path + " HTTP/1.1\r\n";
header += "Host: " + this->szHost + "\r\n";
header += "Content-Type: application/x-www-form-urlencoded\r\n";
header += "Content-Length: " + std::to_string(query.size()) + "\r\n";
header += "User-Agent: " + this->szUserAgent +"\r\n";
header += "\r\n";
header += query;
if (send(this->Socket, header.c_str(), header.size(), 0) == SOCKET_ERROR){
printf_s("Error::send: %d\n", WSAGetLastError());
return false;
}
return true;
}
bool cWinSoket::Recv(char *buf, int len){
if (recv(Socket, buf, len, 0) == SOCKET_ERROR){
return false;
}
return true;
}
cWinSoket::~cWinSoket(){
closesocket(this->Socket);
WSACleanup();
}
Использовать так:
php:
Код:
switch ($_POST['MESSAGE']) {
case 'USER':
echo 'Крайслер';
break;
}
Код:
cWinSoket* m_pSoket = new cWinSoket("uengine.loc");
if (m_pSoket->Connect()) {
if (m_pSoket->Send(ePOST , "/TestPost.php", "MESSAGE=USER")) {
char buffer[1024] = { '\0' };
if (m_pSoket->Recv(buffer, 1024))
{
printf_s("All answer:\n%s\n\n",buffer);
std::string szBody = m_pSoket->getBody(buffer);
printf_s("Result answer:\n%s\n", szBody.data());
}
}
}
delete m_pSoket;
Результат: