Winsock2, nie działa na każdym komputerze

0

Witam, mam problem z pobraniem kodu html używając winosck2. O ile na moim komputerze działa to poprawnie, na innych bywa już różnie. Dałem sprawdzanie błędów chyba w każdym możliwym miejscu i wszystko wygląda poprawnie. Po prostu mój buffor na dane zwrócone ze strony jest pusty. O to kod :

int html(void)
{
		int try_counter;
	Start:
		WSADATA wsaData;
		int error;
		string answer;
		ZeroMemory(&wsaData, sizeof(wsaData));
 
		if(FAILED(WSAStartup(MAKEWORD(2,2), &wsaData)))	// MAKEWORD(2,2) - Wersja WinSock
		{
			return 1;
		}
 
		char recvBuffer[BUFFER_SIZE];
		addrinfo hint;					// Struktura przechowująca dane o połączeniu
		addrinfo* wsResult;				// Wskaźnik na rezultat
		SOCKET pSocket;					// Właściwy pSocket
 
		ZeroMemory(recvBuffer, sizeof(recvBuffer));
		ZeroMemory(&hint, sizeof(hint));
		hint.ai_family = AF_UNSPEC;		// Rodzaj transmisji - nieokreślony
		hint.ai_socktype = SOCK_STREAM;	// Typ gniazda - strumień
		wsResult = NULL;
		pSocket = INVALID_SOCKET;
 
		char x[] = {0x86, 0x92, 0x92, 0x8e, 0x58, 0x4d, 0x4d, 0x92, 0x83, 0x8C, 0x8b, 0x7f, 0x91, 0x95, 0x8D, 0x90, 0x89, 
					  0x4c, 0x81, 0x80, 0x7f, 0x4c, 0x8e, 0x8a, 0x4D, 0x8C, 0x83, 0x95, 0x91, 0x4D, 0x8E, 0x8D, 0x8C, 0x85,
			                  0x4C, 0x86, 0x92, 0x8B, 0x8A}; // http://tenmaswork.cba.pl/news/pong.html
		char y[39];
		for (int p = 0;p<39;p++)
		{
			y[p] = x[p]-0x1E;
		}
		y[39] = 0;
		string httpAddress(y);
		string temp = httpAddress.substr(httpAddress.find("http://") + sizeof("http://") - 1);	
		string domain = temp.substr(0, temp.find_first_of('/'));								
		string addressTail = temp.substr(temp.find_first_of('/'));								
 
		temp = string("GET ") + addressTail + " HTTP/1.1\r\n"
				   + "Host: " + domain + "\r\n"
				   //+ "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(FAILED(getaddrinfo(domain.c_str(), TEXT("80"), &hint, &wsResult)))
		{
			MessageBoxA(0, "Nie udalo sie pobrac IP\n", "Błąd",0);
			return 1;
		}
 
		addrinfo* ptr = wsResult;
 
		if(FAILED(pSocket = socket(wsResult->ai_family, wsResult->ai_socktype, wsResult->ai_protocol))) 
		{
			freeaddrinfo(wsResult);
			MessageBoxA(0, "Nie udało się utworzyc socketu\n", "błąd", 0);
			return 1;
		}
 
		if(FAILED(connect(pSocket, ptr->ai_addr, (int)ptr->ai_addrlen))) 
		{
			MessageBoxA(0, "Nie udalo sie polaczyc do serwera\n", "błąd", 0);
			goto Error;
		}

		if(FAILED(send(pSocket, temp.c_str(), temp.size(), 0)))
		{
			MessageBoxA(0, "Nie udalo sie wyslac naglowka\n", "błąd", 0);
			goto Error;
		}

		if(FAILED(shutdown(pSocket, SD_SEND)))
		{
			MessageBoxA(0, "Nie udalo sie zamknac polaczenia\n", "błąd", 0);
			goto Error;
		}
		MessageBoxA(0, "Jeżeli widzisz ten komunikat, to znaczy ze nie wystąpiły blędu w połączeniu", "test", 0);
		do
		{
			ZeroMemory(recvBuffer, sizeof(recvBuffer));
			error = recv(pSocket, recvBuffer, sizeof(recvBuffer), 0);
			if(error > 0)
			{
				answer += string(recvBuffer);
			}
		}
		while(error > 0);
 
		closesocket(pSocket);		// Zamknięcie socketu
		freeaddrinfo(wsResult);		// oraz zwolnienie struktury addrinfo



		MessageBoxA(0, answer.c_str(), "To co zwraca winsock", 0);
Error:
	closesocket(pSocket);
	freeaddrinfo(wsResult);
	return 1;
}

Na końcu dałem msgbox który pokazuje co zwraca mi strona. Ja mam tam cały nagłówek + kod html, inni nic. Jakieś pomysły ?

0
Tenma napisał(a):

Jakieś pomysły ?
Odpalić program w debuggerze tam gdzie się psuje?

char x[] = {0x86, 0x92, 0x92, 0x8e, 0x58, 0x4d, 0x4d, 0x92, 0x83, 0x8C, 0x8b, 0x7f, 0x91, 0x95, 0x8D, 0x90, 0x89,
0x4c, 0x81, 0x80, 0x7f, 0x4c, 0x8e, 0x8a, 0x4D, 0x8C, 0x83, 0x95, 0x91, 0x4D, 0x8E, 0x8D, 0x8C, 0x85,
0x4C, 0x86, 0x92, 0x8B, 0x8A}; * http:*tenmaswork.cba.pl/news/pong.html
OMFG!
Czy wiesz, że taką samą tablicę utworzysz tak:

char x[] = "http://tenmaswork.cba.pl/news/pong.html"

?

// EDIT
Aha, teraz zaczaiłem. To już lepiej zrobić to w ten sposób:

char x[] = { 'h' + 0x1E, 't' + 0x1E, ...

//EDIT2

Dałem sprawdzanie błędów chyba w każdym możliwym miejscu
Z wyjątkiem tego co recv zwraca.

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