Tuesday, November 15, 2016

WinSock Server

// WinSockServer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#undef UNICODE

#define WIN32_LEAN_AND_MEAN

#include 
#include 
#include 
#include 
#include 

// 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 "27015"

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) {
  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
 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;
 }

 // 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);
   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;
}

WinSock Client

// WinSockClient.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN

#include 
#include 
#include 
#include 
#include 


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")


#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

int __cdecl main(int argc, char **argv)
{
 WSADATA wsaData;
 SOCKET ConnectSocket = INVALID_SOCKET;
 struct addrinfo *result = NULL,
  *ptr = NULL,
  hints;
 char *sendbuf = "this is a test";
 char recvbuf[DEFAULT_BUFLEN];
 int iResult;
 int recvbuflen = DEFAULT_BUFLEN;

 // Validate the parameters
 if (argc != 2) {
  printf("usage: %s server-name\n", argv[0]);
  return 1;
 }

 // 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_UNSPEC;
 hints.ai_socktype = SOCK_STREAM;
 hints.ai_protocol = IPPROTO_TCP;

 // Resolve the server address and port
 iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
 if (iResult != 0) {
  printf("getaddrinfo failed with error: %d\n", iResult);
  WSACleanup();
  return 1;
 }

 // Attempt to connect to an address until one succeeds
 for (ptr = result; ptr != NULL;ptr = ptr->ai_next) {

  // Create a SOCKET for connecting to server
  ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
   ptr->ai_protocol);
  if (ConnectSocket == INVALID_SOCKET) {
   printf("socket failed with error: %ld\n", WSAGetLastError());
   WSACleanup();
   return 1;
  }

  // Connect to server.
  iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
  if (iResult == SOCKET_ERROR) {
   closesocket(ConnectSocket);
   ConnectSocket = INVALID_SOCKET;
   continue;
  }
  break;
 }

 freeaddrinfo(result);

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

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

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

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

 // Receive until the peer closes the connection
 do {

  iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
  if (iResult > 0)
  {
   recvbuf[iResult] = NULL;
   printf("Msg: %s\nBytes received: %d\n", recvbuf, iResult);
  }
  else if (iResult == 0)
   printf("Connection closed\n");
  else
   printf("recv failed with error: %d\n", WSAGetLastError());

 } while (iResult > 0);

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

 return 0;
}