+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

Richiesta HTTP per GitHub API (C++)

  1. #1
    Criper98 non  in linea Novello
    Salve a tutti, sto scrivendo un semplice programma in C++ che ha la funzione di mendare una richiesta HTTP al server API di GitHub per sapere l'ultima versione di un repo. Non avendo mai dovuto affrontare un problema del genere non so come fare, ho tentato qualche richiesta tramite socket ma a quanto pare sbaglio qualcosa.

    Grazie in anticipo per l'aiuto!

    P.s. lavoro su un OS Windows.

  2. #2
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    Criper98 non  in linea Novello
    esattamente

  4. #4
    Criper98 non  in linea Novello
    Ho provato qualche soluzione, anche con librerie come curl ma vorrei utilizzare le socket, ho aggiornato il codice che hai visto nell'altro forum in questo modo:

    #include <iostream>
    #include <winsock2.h>
    #include <Ws2tcpip.h>
    #include <windows.h>
    
    
    SOCKET Client;
    addrinfo Server;
    
    using namespace std;
    
    int initSock();
    SOCKET createSock();
    addrinfo getSinfo(SOCKET,int);
    addrinfo wcon(SOCKET,addrinfo);
    
    int main()
    {
    	int PORTA=80;
    	
    	if(initSock()!=-1)
    	{
    		Client=createSock();
    		if(Client!=0)
    		{
    			Server=getSinfo(Client,PORTA);
    			if(Server.ai_family==-1)
    				return 0;
    		}
    		else if(Client==0)
    			return 0;
    	}
    	else if(initSock()==-1)
    		return 0;
    	
    	Server=wcon(Client,Server);
    	
    	const char* request="GET /repos/<owner>/<repo>/releases/latest";
    	send(Client,request,strlen(request),0);
    	
    	char buffer[10000];
        ZeroMemory(buffer, sizeof(buffer));
        int dataLen;
        while ((dataLen = recv(Client, buffer, sizeof(buffer), 0) > 0))
        {
            int i = 0;
            while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
                cout << buffer[i];
                i += 1;
            }
        }
    	
    	
    	closesocket(Client);
    	WSACleanup();
    	
    	system("pause");
    	return 0;
    }
    
    int initSock()
    {
    	WSADATA WSAData;
    	if(WSAStartup (MAKEWORD(2,2), &WSAData))
    	{
    		cout<<"Errore nell'inizializzazione delle socket..."<<endl;
    		WSACleanup();
    		return -1;
    	}
    	return 0;
    }
    
    SOCKET createSock()
    {
    	SOCKET s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(s == INVALID_SOCKET)
    	{
    		cout<<"Errore nella creazione del socket... "<<WSAGetLastError()<<endl;
    		closesocket(s);
    		WSACleanup();
    		return 0;
    	}
    	return s;
    }
    
    addrinfo getSinfo(SOCKET s,int p)
    {
    	addrinfo *ainfo;
    	if (getaddrinfo("api.github.com", NULL, NULL, &ainfo))
    	{
    		cout<<"Errore: impossibile risolvere l'indirizzo..."<<endl;
    		closesocket(s);
    		WSACleanup();
    		ainfo->ai_family=-1;
    		return *ainfo;
    	}
    	((sockaddr_in *)(ainfo->ai_addr))->sin_port = htons (p);
    	return *ainfo;
    }
    
    addrinfo wcon(SOCKET s,addrinfo a)
    {
    	DWORD cchCN=30;
    	cout<<"<Client> Tento di connettermi al Server..."<<endl;
    	while(true)
    	{
    		Sleep(1000);
    		if(connect(s,(sockaddr *)(a.ai_addr),sizeof(sockaddr_in)))
    		{
    			freeaddrinfo(a.ai_next);
    			cout<<"<Client> Errore: impossibile connettersi, riprovo..."<<endl;
    		}
    		else
    		{
    			cout<<"<Client> Connesso con il Server!\n"<<endl;
    			break;
    		}
    	}
    	freeaddrinfo(a.ai_next);
    	return a;
    }
    
    in ogni caso non raggiungo il risultato sperato, ottengo la sorgente HTML della pagina principale di GitHub e non capisco il perch...

    P.s. ovviamente ho sostituito <owner> e <repo>.
    Ultima modifica di AntonioG; 31-10-2020 05:22  Motivo: I TAG CODE per il codice

  5. #5
    Puoi fornirmi le parti owner repos per delle prove (anche in pvt)?
    ℹ️ Leggi di pi su AntonioG ...

  6. #6
    Criper98 non  in linea Novello
    Ho provato a mandarteli in privato ma sembra che non me li faccia mandare, hai altri contatti?

  7. #7
    Li ho ricevuti, perch pensi di no?

    Comunque il problema abbastanza complesso. Il dialogo deve essere https e non http e devi usare il protocollo TLS 1.2.

    In C** puro con socket molto complesso e non il caso di farlo. In C# puoi usare poche righe

    using System;
    using System.IO;
    using System.Net;
    
    namespace ConsoleApplication20
    {
        class Program
        {
            static void Main(string[] args)
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.github.com/repos/Criper98/DOSrat/releases/latest");
                request.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36";
                request.Credentials = CredentialCache.DefaultCredentials;
    
                WebResponse response = request.GetResponse();
    
                using (Stream dataStream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(dataStream);
                    string responseFromServer = reader.ReadToEnd();
                    Console.WriteLine(responseFromServer);
                }
    
                response.Close();
            }
        }
    }
    
    ℹ️ Leggi di pi su AntonioG ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. da http ad https
    Da Carmen nel forum ASP 3, ASP .Net
    Risposte: 2
    Ultimo Post: 17-06-2017, 14:40
  2. richiesta http web service
    Da imgsimonebiliato nel forum Delphi
    Risposte: 3
    Ultimo Post: 04-10-2013, 16:13
  3. Risposte: 3
    Ultimo Post: 19-12-2010, 18:04
  4. post/get http
    Da papy2 nel forum Visual Basic 6
    Risposte: 0
    Ultimo Post: 05-12-2007, 15:12
  5. http://www.naplesign.it
    Da Virpel nel forum Pausa caff
    Risposte: 2
    Ultimo Post: 29-11-2005, 15:16