Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

[C\C++] WinSoket (http\GET\POST)

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
994
Реакции
1,209
вполне работоспособный кусок из моего стародавнего проекта.
Вырезал все навесные методы, оставив только основную(очень упрощенную) рабочию часть.
В коде умышленно допущен "недочет"(не влияющий на общию работоспособность), дабы был)))

.h
Код:
Expand Collapse Copy
#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
Код:
Expand Collapse Copy
#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:
Код:
Expand Collapse Copy
switch ($_POST['MESSAGE']) {
    case 'USER':
        echo 'Крайслер';
        break;
}
С++:
Код:
Expand Collapse Copy
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;


Результат:
wkXeBiEk.png
 
Назад
Сверху Снизу