Two requests with one socket

Hello

I have coded the whole structure of a Windows socket and am able to send one request. However, I want to send two.
The first one is working, the second one not.
WSAGetLastError() returns 0, but I guess that means that there was just no error?

Code:
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
#define _WIN32_WINNT 0x501
#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main() {
	//Initializing specific depencies on socket
	WSADATA wsaData;	//Data about the socket
	WSADATA *wsaDataP = &wsaData;
	if (WSAStartup(2, wsaDataP) != 0) {
		//Error when starting up WSA
		return -1;
	}

	//Giving properties to socket
	struct addrinfo properties;	//Holding hostaddress information
	memset(&properties, 0, sizeof(properties)); //Filling with zero's to avoid garbage
	properties.ai_family = AF_INET;			//ipv4
	properties.ai_protocol = IPPROTO_TCP;	//TCP
	properties.ai_socktype = SOCK_STREAM;	//TCP ==> SOCK_STREAM


	//Getting ipv4 of specific host
	struct addrinfo *targetinfo = NULL;
	DWORD ipv4OfHost = getaddrinfo("www.google.com", NULL, &properties, &targetinfo);
	if (ipv4OfHost != 0 || targetinfo == NULL) {
		//Not able to resolve hostname
		return -1;
	}
	//Initialize socket address information (about target) based on ipv4
	SOCKADDR_IN sockAddr;
	sockAddr.sin_addr = ((struct sockaddr_in *) targetinfo->ai_addr)->sin_addr;	//ipv4 address of target
	sockAddr.sin_family = AF_INET;	//ipv4
	sockAddr.sin_port = htons(80); //Port 80; htons : converted to network bytes
	freeaddrinfo(targetinfo);	//freeing targetinfo from getaddrinfo

	//Making the socket
	struct addrinfo *p = NULL;
	SOCKET Vsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (Vsocket == INVALID_SOCKET) {
		//Error while making socket
		return -1;
	}

	//Connecting to target
	int connection = connect(Vsocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
	if (connection != 0) {
		//Connection failed
		cout << WSAGetLastError();
		cin.ignore().get();
		return -1;
	}

	//Sending request
	const char *request = "GET /intl/nl/policies/privacy/ HTTP / 1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n";
	int sendBytesAmount = send(Vsocket, request, strlen(request), 0);
	if (sendBytesAmount < strlen(request) || sendBytesAmount == SOCKET_ERROR) {
		//Failed sending request
		return -1;
	}

	//Receiving answer
	char buffer[256];
	int datalen;
	while((datalen = recv(Vsocket, buffer, sizeof(buffer), 0) > 0)) {
		int i = 0;
		while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
			cout << buffer[i];
			i++;
		}
	}
	
	/////////////////////////////////SECOND time
	
	cout << "\n\n----------------------------------------------------------\n\n";
	
	//Sending request
	const char *request2 = "GET / HTTP / 1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n";
	sendBytesAmount = send(Vsocket, request2, strlen(request2), 0);
	if (sendBytesAmount < strlen(request2) || sendBytesAmount == SOCKET_ERROR) {
		//Failed sending request
		cout << "error";
		return -1;
	}

	//Receiving answer
	datalen;
	while((datalen = recv(Vsocket, buffer, sizeof(buffer), 0) > 0)) {
		int i = 0;
		while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
			cout << buffer[i];
			i++;
		}
	}

	cout << WSAGetLastError();
	cin.ignore().get();
}


I'm probably totally missing the ball here, but what am I doing wrong?
Thanks!
Last edited on
No one who can help me?

Edit;
Solved it, had to remove some spaces from HTTP-request string and hat to use the setsockopt function.

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
#define _WIN32_WINNT 0x501
#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main() {
	//Initializing specific depencies on socket
	WSADATA wsaData;	//Data about the socket
	WSADATA *wsaDataP = &wsaData;
	if (WSAStartup(2, wsaDataP) != 0) {
		//Error when starting up WSA
		return -1;
	}

	//Giving properties to socket
	struct addrinfo properties;	//Holding hostaddress information
	memset(&properties, 0, sizeof(properties)); //Filling with zero's to avoid garbage
	properties.ai_family = AF_INET;			//ipv4
	properties.ai_protocol = IPPROTO_TCP;	//TCP
	properties.ai_socktype = SOCK_STREAM;	//TCP ==> SOCK_STREAM


	//Getting ipv4 of specific host
	struct addrinfo *targetinfo = NULL;
	DWORD ipv4OfHost = getaddrinfo("www.google.com", NULL, &properties, &targetinfo);
	if (ipv4OfHost != 0 || targetinfo == NULL) {
		//Not able to resolve hostname
		return -1;
	}
	//Initialize socket address information (about target) based on ipv4
	SOCKADDR_IN sockAddr;
	sockAddr.sin_addr = ((struct sockaddr_in *) targetinfo->ai_addr)->sin_addr;	//ipv4 address of target
	sockAddr.sin_family = AF_INET;	//ipv4
	sockAddr.sin_port = htons(80); //Port 80; htons : converted to network bytes
	freeaddrinfo(targetinfo);	//freeing targetinfo from getaddrinfo

	//Making the socket
	struct addrinfo *p = NULL;
	SOCKET Vsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (Vsocket == INVALID_SOCKET) {
		//Error while making socket
		return -1;
	}
	
	int aliveToggle = 1;
	setsockopt(Vsocket,SOL_SOCKET,SO_KEEPALIVE,(char*)&aliveToggle, sizeof(aliveToggle));

	//Connecting to target
	int connection = connect(Vsocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
	if (connection != 0) {
		//Connection failed
		cout << WSAGetLastError();
		cin.ignore().get();
		return -1;
	}

	//Sending request
	const char *request = "GET / HTTP/1.1\r\nHost: www.gnu.org\r\nConnection: Keep-Alive\r\n\r\n";
	int sendBytesAmount = send(Vsocket, request, strlen(request), 0);
	if (sendBytesAmount < strlen(request) || sendBytesAmount == SOCKET_ERROR) {
		//Failed sending request
		return -1;
	}

	//Receiving answer
	char buffer[10000];
	int datalen;
	while((datalen = recv(Vsocket, buffer, sizeof(buffer), 0) > 0)) {
		int i = 0;
		while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
			cout << buffer[i];
			i++;
		}
	}
	
	/////////////////////////////////SECOND time
	
	cout << "\n\n----------------------------------------------------------\n\n";
	
	//Sending request
	const char *request2 = "GET / HTTP/1.1\r\nHost: www.gnu.org\r\nConnection: Keep-Alive\r\n\r\n";
	sendBytesAmount = send(Vsocket, request2, strlen(request2), 0);
	if (sendBytesAmount < strlen(request2) || sendBytesAmount == SOCKET_ERROR) {
		//Failed sending request
		cout << "error";
		return -1;
	}

	//Receiving answer
	datalen;
	while((datalen = recv(Vsocket, buffer, sizeof(buffer), 0) > 0)) {
		int i = 0;
		while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
			cout << buffer[i];
			i++;
		}
	}

	cout << WSAGetLastError();
	cin.ignore().get();
}

Last edited on
Topic archived. No new replies allowed.