Winsock Connecting via URL

Hey guys,

I'm trying to fetch a .txt file from a website and have set up a socket to do so. The socket works perfectly and I can connect to 99% of websites. However, the specific site I need to connect to is hosted on some kind of CDN that doesn't allow me to connect using an IP address. I need to use the URL. I know this because I:

1) Tried to connect with the IP in my browser and it doesn't work
2) Tried to write a Perl script that uses the URL and it does work.

So my question is then, how can I resolve this problem?

This is my socket application:

Connector.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "Connector.h"
#include "stdio.h"
#include <string>

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "80"

using namespace std;

int iResult;

void Connector::init()
{
	WSADATA wsaData;

	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

	if (iResult != 0) {
		printf("WSAStartup failed: %d\n", iResult);
		return;
	}

	return;
}

SOCKET Connector::connectSocket(string address)
{
	struct addrinfo *result = NULL,
					*ptr = NULL,
					hints;
	SOCKET ConnectSocket = INVALID_SOCKET;

	ZeroMemory(&hints, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;

	// Resolve server address and port
	iResult = getaddrinfo(address.c_str(), DEFAULT_PORT, &hints, &result);
	if (iResult != 0) {
		printf("getaddrinfo failed with error: %d\n", iResult);
		WSACleanup();
		return INVALID_SOCKET;
	}

	// connect to address
	for (ptr=result; ptr != NULL; ptr=ptr->ai_next) {

		// Create socket for connecting to server
		ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
		if (ConnectSocket == INVALID_SOCKET) {
			printf("socket failed with error: %ld\n", WSAGetLastError());
            WSACleanup();
			return INVALID_SOCKET;
		}

		// Connect to Server
		iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
		if (iResult == SOCKET_ERROR) {
            closesocket(ConnectSocket);
            ConnectSocket = INVALID_SOCKET;
            continue;
        }
        break;
	}

	freeaddrinfo(result);

	if (ConnectSocket == INVALID_SOCKET) {
		printf("Unable to connect to server!\n");;
		WSACleanup();
		return INVALID_SOCKET;
	}

	return ConnectSocket;
}

string Connector::sendRequest(string address, string request)
{
	SOCKET sock = connectSocket(address);
	string response = "";
	int recvbuflen = DEFAULT_BUFLEN;
	char recvbuf[DEFAULT_BUFLEN];

	// Exit the function if the socket failed to connect
	if (sock == INVALID_SOCKET)
		return "ERROR: COULD NOT CONNECT SOCKET";

	// Send a request to the server; Print error if relevant.
	iResult = send(sock, request.c_str(), request.length(), 0);
	if (iResult == SOCKET_ERROR) {
		printf("send failed: %d\n", WSAGetLastError());
		closesocket(sock);
		WSACleanup();
		return "ERROR: COULD NOT SEND REQUEST";
	}

	// Shut down the send element of the socket. We can still receive.
	iResult = shutdown(sock, SD_SEND);
	if (iResult == SOCKET_ERROR) {
		printf("shutdown failed: %d\n", WSAGetLastError());
		closesocket(sock);
		WSACleanup();
		return "ERROR: COULD NOT SHUT DOWN SOCKET";
	}

	// Receive response from server
	do {
		iResult = recv(sock, recvbuf, recvbuflen, 0);
		if (iResult > 0)
			response+= string(recvbuf).substr(0,recvbuflen);
		else if (iResult == 0)
			printf("Connection closed\n");
		else
			printf("recv failed: %d\n", WSAGetLastError());
	} while (iResult > 0);

	// Cleanup
    closesocket(sock);
    WSACleanup();

	return response;
}


And this is the main cpp file.

Main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdio.h"
#include "Connector.h"



using namespace std;

int main()
{
	Connector conn;
	string request;
	string response;

	request += "GET / HTTP/1.0\r\n";
	request += "Host: google.co.uk\r\n";
	request += "\r\n";

	conn.init();
	response = conn.sendRequest("173.194.75.94",request);
	printf(response.c_str());
	system("PAUSE");
}


This is my first project involving Winsock, so any help is greatly appreciated!

Thanks,

Cbeppe.
Last edited on
Topic archived. No new replies allowed.