1 #undef UNICODE
  2 
  3 #define WIN32_LEAN_AND_MEAN
  4 
  5 #include <windows.h>
  6 #include <winsock2.h>
  7 #include <ws2tcpip.h>
  8 #include <stdlib.h>
  9 #include <stdio.h>
 10 
 11 // Need to link with Ws2_32.lib
 12 #pragma comment (lib, "Ws2_32.lib")
 13 // #pragma comment (lib, "Mswsock.lib")
 14 
 15 #define DEFAULT_BUFLEN 512
 16 #define DEFAULT_PORT "27015"
 17 
 18 int __cdecl main(void) 
 19 {
 20     WSADATA wsaData;
 21     int iResult;
 22 
 23     SOCKET ListenSocket = INVALID_SOCKET;
 24     SOCKET ClientSocket = INVALID_SOCKET;
 25 
 26     struct addrinfo *result = NULL;
 27     struct addrinfo hints;
 28 
 29     int iSendResult;
 30     char recvbuf[DEFAULT_BUFLEN];
 31     int recvbuflen = DEFAULT_BUFLEN;
 32     
 33     // Initialize Winsock
 34     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
 35     if (iResult != 0) {
 36         printf("WSAStartup failed with error: %d\n", iResult);
 37         return 1;
 38     }
 39 
 40     ZeroMemory(&hints, sizeof(hints));
 41     hints.ai_family = AF_INET;
 42     hints.ai_socktype = SOCK_STREAM;
 43     hints.ai_protocol = IPPROTO_TCP;
 44     hints.ai_flags = AI_PASSIVE;
 45 
 46     // Resolve the server address and port
 47     iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
 48     if ( iResult != 0 ) {
 49         printf("getaddrinfo failed with error: %d\n", iResult);
 50         WSACleanup();
 51         return 1;
 52     }
 53 
 54     // Create a SOCKET for connecting to server
 55     ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
 56     if (ListenSocket == INVALID_SOCKET) {
 57         printf("socket failed with error: %ld\n", WSAGetLastError());
 58         freeaddrinfo(result);
 59         WSACleanup();
 60         return 1;
 61     }
 62 
 63     // Setup the TCP listening socket
 64     iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
 65     if (iResult == SOCKET_ERROR) {
 66         printf("bind failed with error: %d\n", WSAGetLastError());
 67         freeaddrinfo(result);
 68         closesocket(ListenSocket);
 69         WSACleanup();
 70         return 1;
 71     }
 72 
 73     freeaddrinfo(result);
 74 
 75     iResult = listen(ListenSocket, SOMAXCONN);
 76     if (iResult == SOCKET_ERROR) {
 77         printf("listen failed with error: %d\n", WSAGetLastError());
 78         closesocket(ListenSocket);
 79         WSACleanup();
 80         return 1;
 81     }
 82 
 83     // Accept a client socket
 84     ClientSocket = accept(ListenSocket, NULL, NULL);
 85     if (ClientSocket == INVALID_SOCKET) {
 86         printf("accept failed with error: %d\n", WSAGetLastError());
 87         closesocket(ListenSocket);
 88         WSACleanup();
 89         return 1;
 90     }
 91 
 92     // No longer need server socket
 93     closesocket(ListenSocket);
 94 
 95     // Receive until the peer shuts down the connection
 96     do {
 97 
 98         iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
 99         if (iResult > 0) {
100             printf("Bytes received: %d\n", iResult);
101 
102         // Echo the buffer back to the sender
103             iSendResult = send( ClientSocket, recvbuf, iResult, 0 );
104             if (iSendResult == SOCKET_ERROR) {
105                 printf("send failed with error: %d\n", WSAGetLastError());
106                 closesocket(ClientSocket);
107                 WSACleanup();
108                 return 1;
109             }
110             printf("Bytes sent: %d\n", iSendResult);
111         }
112         else if (iResult == 0)
113             printf("Connection closing...\n");
114         else  {
115             printf("recv failed with error: %d\n", WSAGetLastError());
116             closesocket(ClientSocket);
117             WSACleanup();
118             return 1;
119         }
120 
121     } while (iResult > 0);
122 
123     // shutdown the connection since we're done
124     iResult = shutdown(ClientSocket, SD_SEND);
125     if (iResult == SOCKET_ERROR) {
126         printf("shutdown failed with error: %d\n", WSAGetLastError());
127         closesocket(ClientSocket);
128         WSACleanup();
129         return 1;
130     }
131 
132     // cleanup
133     closesocket(ClientSocket);
134     WSACleanup();
135 
136     return 0;
137 }