Partage
  • Partager sur Facebook
  • Partager sur Twitter

requete http sans librairie (socket pur)

Sujet résolu
    24 juillet 2023 à 11:20:51

    Bonjour a tous dans le cadre d'un exercice je dois envoyer une requête uniquement avec des sockets. Je dois envoyer un Get a cette adresse http://httpbin.org/ip

    Sur mon navigateur ca fonctionne, j'ai aussi désactivé le par feu mais j'ai une erreur sur le connect et WSAGetLastError retourne 0

    #include <iostream>
    #include <string>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #pragma comment(lib, "ws2_32.lib")
    
    int main() {
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
            std::cerr << "Impossible d'initialiser Winsock." << std::endl;
            return 1;
        }
    
        SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (clientSocket == INVALID_SOCKET) {
            std::cerr << "Erreur lors de la création du socket." << std::endl;
            WSACleanup();
            return 1;
        }
    
        struct sockaddr_in serverAddress;
        serverAddress.sin_family = AF_INET;
        serverAddress.sin_port = htons(80); // Port 80 pour HTTP
        inet_pton(AF_INET, "httpbin.org", &serverAddress.sin_addr);
    
        if (connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {
            std::cerr << "Erreur lors de la connexion au serveur." << std::endl;
            closesocket(clientSocket);
            std::cout << "last error : " << WSAGetLastError();
            WSACleanup();
            return 1;
        }
    
        std::string request = "GET /ip HTTP/1.1";
        request += " Host: httpbin.org";
        request += " Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7";
        request += " Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7";
        request += " Cache-Control: no-cache";
        request += " Connection: keep-alive";
        request += " Pragma: no-cache";
        request += " Upgrade-Insecure-Requests: 1";
        request += " User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";
    
        if (send(clientSocket, request.c_str(), request.length(), 0) == SOCKET_ERROR) {
            std::cerr << "Erreur lors de l'envoi de la requête." << std::endl;
            closesocket(clientSocket);
            WSACleanup();
            return 1;
        }
    
        char buffer[4096];
        std::string response;
    
        int bytesReceived;
        do {
            bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
            if (bytesReceived > 0) {
                response.append(buffer, bytesReceived);
            }
        } while (bytesReceived > 0);
    
        std::cout << "Réponse du serveur : " << std::endl;
        std::cout << response << std::endl;
    
        closesocket(clientSocket);
        WSACleanup();
        return 0;
    }
    



    -
    Edité par JEANBAPTISTECOMTE1 24 juillet 2023 à 11:25:49

    • Partager sur Facebook
    • Partager sur Twitter
      24 juillet 2023 à 14:28:53

      inet_pton(AF_INET, "httpbin.org", &serverAddress.sin_addr);

      inet_pton attend une adresse IP sous forme de chaîne de caractère. Ex :

      inet_pton(AF_INET, "104.26.8.59", &serverAddress.sin_addr);



      • Partager sur Facebook
      • Partager sur Twitter
      ...
        24 juillet 2023 à 14:58:35

        Il faut utiliser getaddrinfo pour résoudre un nom de domaine (ou au pire l'obsolète gethostbyname). Autres notes :

        • Il est préférable d'initialiser les structures à zéro quand tu remplis pas tous les champs (sockaddr_in)
        • La fonction send peut être interrompue avant la fin de l'envoi d'un message (donc doit en général apparaitre dans une boucle)

        -
        Edité par markand 24 juillet 2023 à 14:59:19

        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          24 juillet 2023 à 16:04:36

          Parfait ca fonctionne j'ai simplement a modifier les headers et je penses que ca sera bon

          #include <iostream>
          #include <string>
          #include <winsock2.h>
          #include <ws2tcpip.h>
          #pragma comment(lib, "ws2_32.lib")
          
          int main() {
              WSADATA wsaData;
              if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
                  std::cerr << "Impossible d'initialiser Winsock." << std::endl;
                  return 1;
              }
          
              SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
              if (clientSocket == INVALID_SOCKET) {
                  std::cerr << "Erreur lors de la création du socket." << std::endl;
                  WSACleanup();
                  return 1;
              }
          
              struct addrinfo* result = nullptr;
              struct addrinfo hints;
          
              ZeroMemory(&hints, sizeof(hints));
              hints.ai_family = AF_INET;
              hints.ai_socktype = SOCK_STREAM;
              hints.ai_protocol = IPPROTO_TCP;
          
              int addrInfoResult = getaddrinfo("httpbin.org", "80", &hints, &result);
              if (addrInfoResult != 0) {
                  std::cerr << "Erreur lors de la résolution DNS." << std::endl;
                  closesocket(clientSocket);
                  WSACleanup();
                  return 1;
              }
          
              if (connect(clientSocket, result->ai_addr, static_cast<int>(result->ai_addrlen)) == SOCKET_ERROR) {
                  std::cerr << "Erreur lors de la connexion au serveur." << std::endl;
                  closesocket(clientSocket);
                  std::cout << "last error : " << WSAGetLastError();
                  WSACleanup();
                  return 1;
              }
          
              std::string request = "GET /ip HTTP/1.1";
              request += " Host: httpbin.org";
              request += " Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7";
              request += " Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7";
              request += " Cache-Control: no-cache";
              request += " Connection: keep-alive";
              request += " Pragma: no-cache";
              request += " Upgrade-Insecure-Requests: 1";
              request += " User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";
          
              if (send(clientSocket, request.c_str(), request.length(), 0) == SOCKET_ERROR) {
                  std::cerr << "Erreur lors de l'envoi de la requête." << std::endl;
                  closesocket(clientSocket);
                  WSACleanup();
                  return 1;
              }
          
              char buffer[4096];
              std::string response;
          
              int bytesReceived;
              do {
                  bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
                  if (bytesReceived > 0) {
                      response.append(buffer, bytesReceived);
                  }
              } while (bytesReceived > 0);
          
              std::cout << "Réponse du serveur : " << std::endl;
              std::cout << response << std::endl;
          
              closesocket(clientSocket);
              WSACleanup();
              return 0;
          }
          



          • Partager sur Facebook
          • Partager sur Twitter
            25 juillet 2023 à 11:55:23

            Remarque à 2 balles, les winsocks, c'est une librairie comme une autre, pas plus "pur" que le reste.
            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              26 juillet 2023 à 8:49:00

              std::string request = "GET /ip HTTP/1.1";
                  request += " Host: httpbin.org";
                  request += " Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7";
                  request += " Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7";
                

              Faut peut être y mettre des marques de fin de ligne '\r\n" de temps en temps ?

              -
              Edité par michelbillaud 26 juillet 2023 à 8:51:29

              • Partager sur Facebook
              • Partager sur Twitter
                27 juillet 2023 à 20:03:40

                Oui, j'ai fait quelques modifs. Ca fonctionne parfaitement merci a tous
                • Partager sur Facebook
                • Partager sur Twitter
                  29 juillet 2023 à 7:40:23

                  Ça intéresserait peut être les prochains lecteurs de voir la version corrigée qui fonctionne parfaitement ?
                  • Partager sur Facebook
                  • Partager sur Twitter

                  requete http sans librairie (socket pur)

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown