// client.cpp

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
  WSADATA wsaData;
  int res = WSAStartup(MAKEWORD(2, 2), &wsaData);
  if (res != NO_ERROR) {
    cout << "WSASTartup error: " << WSAGetLastError() << "\n";
    return 1;
  }

  SOCKET s;
  s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (s == INVALID_SOCKET) {
    cout << "socket() error: " << WSAGetLastError() << "\n";
    WSACleanup();
    return 1;
  }

  SOCKADDR_IN sa = {0};
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = inet_addr("127.0.0.1");
  sa.sin_port = htons(27015);

  if (connect(s, (SOCKADDR*)&sa, sizeof(sa)) == SOCKET_ERROR) {
    cout << "connect() error: " << WSAGetLastError() << "\n";
    WSACleanup();
    return 1;
  }

  cout << "Connected to server.\n";

  closesocket(s);
  WSACleanup();

  return 0;
}
// server.cpp

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
  WSADATA wsaData;
  int res = WSAStartup(MAKEWORD(2, 2), &wsaData);
  if (res != NO_ERROR) {
    cout << "WSASTartup error: " << WSAGetLastError() << "\n";
    return 1;
  }

  SOCKET s;
  s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (s == INVALID_SOCKET) {
    cout << "socket() error: " << WSAGetLastError() << "\n";
    WSACleanup();
    return 1;
  }

  SOCKADDR_IN sa = {0};
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = inet_addr("127.0.0.1");
  sa.sin_port = htons(27015);

  if (bind(s, (SOCKADDR*) &sa, sizeof(sa)) == SOCKET_ERROR) {
    cout << "bind() error: " << WSAGetLastError() << "\n";
    WSACleanup();
    return 1;
  }

  if (listen(s, 1) == SOCKET_ERROR) {
    cout << "listen() error: " << WSAGetLastError() << "\n";
    WSACleanup();
    return 1;
  }

  SOCKET acc;
  cout << "Waiting for client to connect...\n";

  while (1) {
    acc = SOCKET_ERROR;
    while (acc == SOCKET_ERROR)
      acc = accept(s, NULL, NULL );
    cout << "Client connected.\n";
    break;
  }

  WSACleanup();

  return 0;
}