title: Winsock - Allowing multiple clients with threads
body: <p>This is the code I have currently, and I'm looking into introducing threads to allow the server process multiple clients at once, however I'm having a little trouble understanding exactly how to do this. Any help would be appreciated.</p>
  
  <p>Client:</p>
  
  <pre><code>int create_client() 
  {
  
  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;
  
  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData);
  if (iResult != 0) {
      printf("WSAStartup failed with error: %d\n", iResult);
      return 1;
  }
  
  ZeroMemory( &amp;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(DEFAULT_IP, DEFAULT_PORT, &amp;hints, &amp;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-&gt;ai_next) {
  
      // Create a SOCKET for connecting to server
      ConnectSocket = socket(ptr-&gt;ai_family, ptr-&gt;ai_socktype, 
          ptr-&gt;ai_protocol);
      if (ConnectSocket == INVALID_SOCKET) {
          printf("socket failed with error: %ld\n", WSAGetLastError());
          WSACleanup();
          return 1;
      }
  
      // Connect to server.
      iResult = connect( ConnectSocket, ptr-&gt;ai_addr, (int)ptr-&gt;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 &gt; 0 )
          printf("Bytes received: %d\n", iResult);
      else if ( iResult == 0 )
          printf("Connection closed\n");
      else
          printf("recv failed with error: %d\n", WSAGetLastError());
  
  } while( iResult &gt; 0 );
  
  // cleanup
  closesocket(ConnectSocket);
  WSACleanup();
  
  return 0;
  }
  </code></pre>
  
  <p>Server:</p>
  
  <pre><code>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), &amp;wsaData);
  if (iResult != 0) {
      printf("WSAStartup failed with error: %d\n", iResult);
      return 1;
  }
  
  ZeroMemory(&amp;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, &amp;hints, &amp;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-&gt;ai_family, result-&gt;ai_socktype, result-&gt;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-&gt;ai_addr, (int)result-&gt;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;
  }
  
  cout &lt;&lt; "Server initalized." &lt;&lt; endl;
  
  // 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 &gt; 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 &gt; 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;
  }
  </code></pre>