socket programming Client and Server bugs

Hey everyone,
I'm following this tutorial over at msdn :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737629%28v=vs.85%29.aspx

And I've come to the end of the tutorial wher I have both codes for Client and Server. But when I was testing the connection between the two proggramms, I noticed a couple of wierd things along with a couple of bugs:

NOTE : I'm using Visual Studios 2013 express version
NOTE : I'm running a 64bit version of windows
NOTE : As a test ip addresse, for the connection, I'm using 127.0.0.1 which is supposed to be the local ip addresse.

-Even if I don't launch the server, the client still says that bytes where sent.
-When I launch the server, it doesn't say anything about bytes it should have received.
-The server doesn't send nything
-And since the server doesn't send anything, the client doesn't receive anything.

I think the client connects to something else than the server which causes it to send data somewhere else than to the server.


Here's my client 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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

int main(int argc, char **argv)
{
	WSADATA wsaData; //creating a WSADATA object

	int iResult;

	//Initialize winsock
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != 0) //Checking for initialization errors
	{
		printf("WSA Startup failed : %d\n", iResult);
		return 1;
	}

	struct addrinfo *result = NULL,
					*ptr = NULL,
					hints;

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

	#define DEFAULT_PORT "27015"

	//Resolve the server and the port
	//The ip adress goes where argv is
	#define IP "127.0.0.1"
	iResult = getaddrinfo(IP, DEFAULT_PORT, &hints, &result);
	if (iResult != 0) //Checking for errors
	{
		printf("getaddrinfo failed: %d\n", iResult);
		WSACleanup();
		return 1;
	}

	SOCKET ConnectSocket = INVALID_SOCKET; //Creating a socket object

	//Attempt to connect to the first address returned by
	//the call to getaddrinfo
	ptr = result;

	//Create a SOCKET for connecting to server
	ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);

	//Check for errors to ensure that the socket is a valid socket
	if (ConnectSocket == INVALID_SOCKET)
	{
		printf("Error at socket(): %ld\n", WSAGetLastError());
		freeaddrinfo(result);
		WSACleanup();
		return 1;
	}

	//Connect to the server
	iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
	if (iResult == SOCKET_ERROR) //Checking fo general errors
	{
		closesocket(ConnectSocket);
		ConnectSocket = INVALID_SOCKET;
	}

	// Should really try the next address returned by getaddrinfo
	// if the connect call failed
	// But for this simple example we just free the resources
	// returned by getaddrinfo and print an error message

	freeaddrinfo(result);

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

	//Sending and receiving data
	#define DEFAULT_BUFLEN 512

	int recvbuflen = DEFAULT_BUFLEN;
	
	char *sendbuf = "this is a test";
	char recvbuf[DEFAULT_BUFLEN];

	//Send an initial buffer
	iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
	if (iResult == SOCKET_ERROR)
	{
		printf("send failed: %d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}

	printf("Bytes sent: %ld\n", iResult);

	// shutdown the connection for sending since no more data will be sent
	// the client can still use the ConnectSocket for receiving data
	iResult = shutdown(ConnectSocket, SD_SEND);
	if (iResult == SOCKET_ERROR)
	{
		printf("shutdown failed: %n\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}

	//Receive data until server closes the connection
	do
	{
		iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
		if (iResult > 0)
			printf("Bytes received: %d\n", iResult);
		else if (iResult == 0)
			printf("connection closed\n");
		else
			printf("recv failed: %d\n", WSAGetLastError());
	} while (iResult > 0);

	// shutdown the send half of the connection since no more data will be sent
	iResult = shutdown(ConnectSocket, SD_SEND);
	if (iResult == SOCKET_ERROR) {
		printf("shutdown failed: %d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}

	// cleanup
	closesocket(ConnectSocket);
	WSACleanup();

	return 0;
}


Here's my server 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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

int main(int argc, char **argv)
{
	WSADATA wsaData; //Creating a WSADATA object
	
	int iResult;

	//Initialize winsock
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != 0)
	{
		printf("WSAStartup failed: %d\n", iResult);
		return 1;
	}

	#define DEFAULT_PORT "27015"

	struct addrinfo *result = NULL,
					*ptr = NULL,
					hints;

	ZeroMemory(&hints, sizeof(hints));
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;
	hints.ai_flags = AI_PASSIVE;

	//Resolve the local address and port to be used by the server
	iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
	if (iResult != 0)
	{
		printf("getaddrinfo failed: %d\n", iResult);
		WSACleanup();
		return 1;
	}

	SOCKET ListenSocket = INVALID_SOCKET;

	//Create a socket for the server to listen for client connections
	ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

	if (ListenSocket == INVALID_SOCKET)
	{
		printf("Error at socket(): %ld\n", WSAGetLastError());
		freeaddrinfo(result);
		WSACleanup();
		return 1;
	}

	//Setup the TCP listening socket
	iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
	if (iResult == SOCKET_ERROR)
	{
		printf("bind failed with error: %d\n", WSAGetLastError());
		freeaddrinfo(result);
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}
	
	freeaddrinfo(result);	//Once the bind function is called, the address information is no longer needed
							//So we free up memory

	//Listening on the socket
	if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
	{
		printf("Listen failed with error; %ld\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}

	SOCKET ClientSocket;//SOCKET Object
	
	ClientSocket = INVALID_SOCKET;

	//Accept a client socket
	ClientSocket = accept(ListenSocket, NULL, NULL);
	if (ClientSocket == INVALID_SOCKET)
	{
		printf("Accept failed: %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}

	#define DEFAULT_BUFLEN 512

	char recvbuf[DEFAULT_BUFLEN];
	int iSendResult;
	int recvbuflen = DEFAULT_BUFLEN;

	//Receive until the peer shuts down the connection
	do
	{
		iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
		for (int i = 0; i < 50; i++)
		{
			std::cout << "test" << std::endl;
		}
		std::cout << iResult << std::endl;
		if (iResult > 0)
		{
			printf("Bytes received: %d\n", iResult);

			//Echo the buffer back to the sender
			iSendResult = send(ClientSocket, recvbuf, iResult, 0);
			if (iSendResult == SOCKET_ERROR)
			{
				printf("send failed: %d\n", WSAGetLastError());
				closesocket(ClientSocket);
				WSACleanup();
				return 1;
			}

			printf("Bytes sent: %d\n", iSendResult);
		}
		else if (iResult == 0)
			printf("Connection closing...\n");
		else
		{
			printf("recv failed: %d\n", WSAGetLastError());
			closesocket(ClientSocket);
			WSACleanup();
			return 1;
		}
	} while (iResult > 0);

	//shutdown the send half connection since no more data will be sent
	iResult = shutdown(ClientSocket, SD_SEND);
	if (iResult == SOCKET_ERROR)
	{
		printf( "Shutdown failed: %d\n", WSAGetLastError() );
		closesocket(ClientSocket);
		WSACleanup();
		return 1;
	}

	//Cleanup
	closesocket(ClientSocket);
	WSACleanup();

	return 0;
}


Please tell me what you think of my problem and help me understand what I need to change in my code.

mindoo
Run netstat -n and see if your ips and sockets show up.
Ok.
I ran that command line and there's only one 127.0.0.1 ip address with port 27015 that shows up and it says state : TIME_WAIT
Why does it say that ?
thanks for your answer,
mindoo
That state is one of the states that a socket goes through. This link is helpful:

https://en.wikipedia.org/wiki/Transmission_Control_Protocol

About half-way down you can find the states.
I looked at your link and it didn't really help me.
I actually realized that when I run the netstat command line without the client or server, it still tells me there is a connection on port 27015 and 127.0.0.1.
Could someone please tell me what my proggramm is actually doing ?

thanks,

mindoo
In your client code at line 128 you may want to shutdown the socket for reading. I'm not sure if this may help. I not really skilled in MS-Windows stuff but maybe it helps for one or another problem?
@tcs
It's what I initially thought would cause the problem but on the tutorial page, they don't say anything about closing that half so I didn't.
I initially thought that I didn't need to open the port since I was doing it on the same computer, but do you guys think I might have to open the port on the windows firewall ?
Any kind of answer would be greatly appreciated,

Mindoo
Hi,
I solved the error. All I did was change the port and it worked.
Thanks for your answers,
mindoo
Topic archived. No new replies allowed.