This tutorial will guide you on how to create a simple tcp/ip client and server application by using windows socket 2 (Winsock2). The following diagram illustrate the design of the application that we’re going to create in this tutorial.
The server will listen at a given IP & port number. whenever it receive message from its connected client, it then print out the message and bouce back the message to the client. On the other hand, the client will connect to the server and user will enter a message to send to the server. the client will print out the message that it receive from the server too. To stop the connection, the client will need to send a message “close” to the server.
- Create a new visual C++ empty project using visual studio 2010 express edition. Name the project ClientExample.
- Add a new visual C++ empty project to the same solution. Name it ServerExample.
- Add a main.cpp file to both ClientExample & ServerExample project.
- Enter the following code to main.cpp in the ClientExample project.
- Enter the following code to main.cpp in the ServerExample project.
- Compile both projects. You may run both client and server application in 2 CMD windows. Enter a message in the client and it will send to the server.
- Download sample source code: ClieServerExample.zip

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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
#define WIN32_LEAN_AND_MEAN #include <WinSock2.h> #include <WS2tcpip.h> #include <iostream> #include <string> // link with Ws2_32.lib #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFFER_LENGTH 512 class Client { public: Client(char* servername) { szServerName = servername; ConnectSocket = INVALID_SOCKET; } bool Start() { WSADATA wsaData; // Initialize Winsock int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return false; } 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; // Resolve the server address and port iResult = getaddrinfo(szServerName, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return false; } ptr = result; // Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %d\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return false; } // Connect to server iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; } freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); return false; } return true; }; // Free the resouces void Stop() { int iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed: %d\n", WSAGetLastError()); } closesocket(ConnectSocket); WSACleanup(); }; // Send message to server bool Send(char* szMsg) { int iResult = send(ConnectSocket, szMsg, strlen(szMsg), 0); if (iResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); Stop(); return false; } return true; }; // Receive message from server bool Recv() { char recvbuf[DEFAULT_BUFFER_LENGTH]; int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0); if (iResult > 0) { char msg[DEFAULT_BUFFER_LENGTH]; memset(&msg, 0, sizeof(msg)); strncpy(msg, recvbuf, iResult); printf("Received: %s\n", msg); return true; } return false; } private: char* szServerName; SOCKET ConnectSocket; }; int main(int argc, CHAR* argv[]) { std::string msg; Client client("127.0.0.1"); if (!client.Start()) return 1; while(true) { std::cout << "Send: "; std::getline(std::cin, msg); // Close the connection when user enter "close" if (msg.compare("close") == 0) { break; } client.Send((char*)msg.c_str()); client.Recv(); } client.Stop(); getchar(); return 0; } |
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 |
#define WIN32_LEAN_AND_MEAN #include <WinSock2.h> #include <WS2tcpip.h> #include <stdio.h> #include <stdlib.h> // link with Ws2_32.lib #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFFER_LENGTH 512 int main() { WSADATA wsaData; // Initialize Winsock int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } struct addrinfo *result = NULL, hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; // Internet address family is unspecified so that either an IPv6 or IPv4 address can be returned hints.ai_socktype = SOCK_STREAM; // Requests the socket type to be a stream socket for the TCP protocol 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(): %d\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: %d", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; } freeaddrinfo(result); // To listen on a socket if ( listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) { printf("listen failed: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } SOCKET ClientSocket; 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; } char recvbuf[DEFAULT_BUFFER_LENGTH]; int iSendResult; // reveice until the client shutdown the connection do { iResult = recv(ClientSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0); if (iResult > 0) { char msg[DEFAULT_BUFFER_LENGTH]; memset(&msg, 0, sizeof(msg)); strncpy(msg, recvbuf, iResult); printf("Received: %s\n", msg); iSendResult = send(ClientSocket, recvbuf, iResult, 0); if (iSendResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } printf("Bytes sent: %ld\n", iSendResult); } else if (iResult == 0) printf("Connection closed\n"); else { printf("recv failed: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); //return 1; } } while (iResult > 0); // Free the resouces closesocket(ListenSocket); WSACleanup(); getchar(); return 0; } |

Hi, I run this program and when I enter message into the client, nothing happens. Server is up. Anyone knows what may be the problem?
Thank you so much!