Created
July 4, 2020 14:53
-
-
Save andraantariksa/21f21a4ea7b3981c236ceab4995443d1 to your computer and use it in GitHub Desktop.
Windows Simple Socket Server Code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// From https://docs.microsoft.com/en-us/windows/win32/winsock/complete-server-code | |
#undef UNICODE | |
#define WIN32_LEAN_AND_MEAN | |
#include <windows.h> | |
#include <winsock2.h> | |
#include <ws2tcpip.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
// Need to link with Ws2_32.lib | |
#pragma comment (lib, "Ws2_32.lib") | |
// #pragma comment (lib, "Mswsock.lib") | |
#define DEFAULT_BUFLEN 512 | |
#define DEFAULT_PORT "123" | |
int __cdecl main(void) | |
{ | |
WSADATA wsaData; | |
int iResult; | |
SOCKET ListenSocket = INVALID_SOCKET; | |
SOCKET ClientSocket = INVALID_SOCKET; | |
struct addrinfo *result = NULL; | |
struct addrinfo hints; | |
int iSendResult; | |
char recvbuf[DEFAULT_BUFLEN]; | |
int recvbuflen = DEFAULT_BUFLEN; | |
// Initialize Winsock | |
iResult = WSAStartup(MAKEWORD(2,2), &wsaData); | |
if (iResult != 0) { | |
printf("WSAStartup failed with error: %d\n", iResult); | |
return 1; | |
} | |
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 server address and port | |
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); | |
if ( iResult != 0 ) { | |
EAI_SERVICE; | |
printf("getaddrinfo failed with error: %d\n", iResult); | |
WSACleanup(); | |
return 1; | |
} | |
// Create a SOCKET for connecting to server | |
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); | |
if (ListenSocket == INVALID_SOCKET) { | |
printf("socket failed with error: %ld\n", WSAGetLastError()); | |
freeaddrinfo(result); | |
WSACleanup(); | |
return 1; | |
} | |
// Setup the TCP listening socket | |
printf("addrlen %d\n", (int)result->ai_addrlen); | |
for(int i = 0; i < 14; ++i) printf("%d\n", (int)result->ai_addr->sa_data[i]); | |
printf("sa_family %d\n", (int)result->ai_addr->sa_family); | |
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); | |
iResult = listen(ListenSocket, SOMAXCONN); | |
if (iResult == SOCKET_ERROR) { | |
printf("listen failed with error: %d\n", WSAGetLastError()); | |
closesocket(ListenSocket); | |
WSACleanup(); | |
return 1; | |
} | |
//// | |
struct sockaddr_in sin; | |
int addrlen = sizeof(sin); | |
if(getsockname(ListenSocket, (struct sockaddr *)&sin, &addrlen) == 0 && | |
sin.sin_family == AF_INET && | |
addrlen == sizeof(sin)) | |
{ | |
int local_port = ntohs(sin.sin_port); | |
printf("Listen on port: %d\n", local_port); | |
} | |
//// | |
// Accept a client socket | |
ClientSocket = accept(ListenSocket, NULL, NULL); | |
if (ClientSocket == INVALID_SOCKET) { | |
printf("accept failed with error: %d\n", WSAGetLastError()); | |
closesocket(ListenSocket); | |
WSACleanup(); | |
return 1; | |
} | |
// No longer need server socket | |
closesocket(ListenSocket); | |
// Receive until the peer shuts down the connection | |
do { | |
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); | |
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 with error: %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 with error: %d\n", WSAGetLastError()); | |
closesocket(ClientSocket); | |
WSACleanup(); | |
return 1; | |
} | |
} while (iResult > 0); | |
// shutdown the connection since we're done | |
iResult = shutdown(ClientSocket, SD_SEND); | |
if (iResult == SOCKET_ERROR) { | |
printf("shutdown failed with error: %d\n", WSAGetLastError()); | |
closesocket(ClientSocket); | |
WSACleanup(); | |
return 1; | |
} | |
// cleanup | |
closesocket(ClientSocket); | |
WSACleanup(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment