sockety i protokol http

0

mam pobrac strone internetowa za pomoca socketu i z wykorzystaniem protokolu http jednak moj program zwraca niestety NULL i nie wiem gdzie popelniam blad :/

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <winsock2.h>
#include <string.h>

void ErrorCode ()
{
  int err = WSAGetLastError();
  switch (err)
  {
    
    }
    WSACleanup();
    system("pause");
    exit(1);
}

int main() {

    SOCKET mySocket = INVALID_SOCKET;
    int port = 80;
    WSADATA wsaData;
    WORD version;
    struct hostent *adres;
    char bufor[2048];
    char* d2="213.251.131.44";
    char* domena = "www.gamedev.pl";
    char* plik = "/articles.php";
    char* header;
    struct sockaddr_in my_addr, wsResult;
    
    //inicjalizacja socketu
    version = MAKEWORD(2,0);
    if (WSAStartup(version, &wsaData) != 0)
    {
       printf("Blad inicjalizacji WSA\n");
       ErrorCode();
    }
    //Tworzenie socketu
    mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    if(mySocket == INVALID_SOCKET)
     {
        printf("Nie mozna stworzyc gniazda\n");
        ErrorCode();
     }
    
    //wyciaganie ip z adresu
    if ((adres=gethostbyname(domena)) == NULL) { // get the host info
        printf("Blad gethostbyname()");
        //herror("gethostbyname");
        exit(1);
    }
    //d2 = inet_ntoa(*((struct in_addr *)adres->h_addr)));
    
    my_addr.sin_family = AF_INET; // host byte order
    my_addr.sin_port = htons(80); // short, network byte order
    my_addr.sin_addr = *((struct in_addr *)adres->h_addr);
    memset(&(my_addr.sin_zero), 0, 8);
    header = "GET /articles.php HTTP/1.1\r\nHost: www.gamedev.pl\r\n\r\n\r\n";
     //header = strcat(strcat(strcat(strcat(strcat(strcat("GET ",plik)," HTTP/1.1\r\n"),"Host: "),domena),"\r\n"),"\r\n\r\n");
    //printf("%s",header);
			   //+ "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5\r\n"
			   //+ "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
			   //+ "Accept-Language: pl,en-us;q=0.7,en;q=0.3\r\n"
			   //+ "Accept-Encoding: gzip,deflate\r\n"
			   //+ "Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7\r\n"
			   //+ "Keep-Alive: 300\r\n"
			   //+ "Connection: keep-alive\r\n"
			   //+ "\r\n\r\n";
    
    if(connect(mySocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) !=0)
    {
       printf("Blad conect()\n");
       ErrorCode();       
    }
    
    if(send(mySocket, header, sizeof(header), 0)==-1)
    {
        printf("Blad Send()\n");
        ErrorCode();               
    }
    
    char* odp;
    int error;
    //int recv(int sockfd, void *buf, int len, unsigned int flags);
    
    do
	 {
		ZeroMemory(bufor, sizeof(bufor));
		error = recv(mySocket, bufor, sizeof(bufor), 0);
		if (error ==-1)
      {
        printf("Blad recv()\n");
        ErrorCode();               
      }
		else if(error > 0)
		{
			odp = strcat(odp,bufor);
	   }
	 }while(error > 0);
    
    printf("Received: %s", odp);
    close(mySocket);
    WSACleanup();
    system("pause");
    return 0;
}

prawdopodobnie popelniam blad przy odczycie danych ale nie jestem tego pewien

0

Nie chce mi się sprawdzać Twojego kodu, ale przeanalizuj sobie mój, który pisałem też dla kogoś z forum.

#include <iostream>
#include <winsock2.h>
#include <cstring>

using namespace std;

int main(int argc, char *argv[])
{
    
	if(argc != 2)
	{
	
		cout<<"Uzycie: "<<argv[0]<<" [kod]"<<endl;
		return 0;
	
	}
	
	WSADATA wsa;
	SOCKET sock;
	struct sockaddr_in server;
	char request[130], buffor[512];
	char *pch;
	
	if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
	{
		
		cout<<"Nie mozna utworzyc WinSocka"<<endl;
		return 0;
	
	}
	
	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sock == INVALID_SOCKET)
	{
	
		cout<<"Nie mozna utworzyc socketa"<<endl;
		return 0;
	
	}
	
	server.sin_family = AF_INET;
	server.sin_port = htons((u_short)80);
	server.sin_addr.s_addr = inet_addr("195.150.9.51");
	memset(&(server.sin_zero), '\0', 8);
	
	if(connect(sock, (sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
	{
	
		cout<<"Nie mozna nawiazac polaczenia."<<endl;
		return 0;
	
	}
	
	sprintf(request, "GET /check_code.php?id=38169&code=AVATAR1&check=%s&type=sms&del=1 HTTP/1.1\r\nHost: dotpay.pl\r\nConnection: close\r\n\r\n", argv[1]);
	
	if(send(sock, request, sizeof(request), 0) > 0)
	{
	
		if(recv(sock, buffor, sizeof(buffor), 0) > 0)
		{
			
			pch = strtok(buffor, "\r\n\r\n");
			while(pch != NULL)
			{
			
				if(pch[0] == '0')
				{
				
					cout<<"bledny kod"<<endl;
					break;
				
                } else if(pch[0] == '1') {
				
					cout<<"kod poprawny"<<endl;
					break;
				
				}
				pch = strtok(NULL, "\r\n\r\n");
			
			}
		
		}
	
	}
	
	WSACleanup();
    closesocket(sock);
    
    return 0;
    
}

Może pomoże.

1 użytkowników online, w tym zalogowanych: 0, gości: 1