In pratica questo è il server principale:


codice:
INT main(int argc, char* argv []){


/* AMBIENTE WINDOWS  */ 

   HANDLE ListaServer[MAX_SERV];
   HANDLE Console;
   DWORD ConsoleId;
   DWORD ServID[MAX_SERV];
   SOCKADDR_IN Client_addr;
   SOCKET listenSocket;
   SOCKET connessione;
   int id_serv,sin_size,i;
   LONG volatile n_serv;
   LONG volatile client[MAX_SERV];
   serv_arg* param;


/*inizializzazione libreria Socket*/

   WORD wVersionRequested = MAKEWORD(2,2);
   WSADATA wsaData;
   int wsastartup = WSAStartup(wVersionRequested, &wsaData);
   if (wsastartup != NO_ERROR) printf("Errore WSAStartup()\n");
   
   id_serv=0;
   for(i=0;i<MAX_SERV;i++) client[i]=0;


/*Inizializzazione connessione server*/

   ConnessioneServer("127.0.0.1",N_PORT,&listenSocket);
   
   printf("Mainserver in attesa di client..\n");

   while(1){
            connessione = accept(listenSocket, (struct sockaddr*)&Client_addr, &sin_size);
	    printf("Accettata Connessione con Client: %s su socket %d\n", inet_ntoa(Client_addr.sin_addr),connessione);
	    InterlockedIncrement(&n_serv);
            param=malloc(sizeof(serv_arg));
             for(i=0;i<MAX_SERV;i++) { if(client[i]==0){ InterlockedIncrement(&(client[i]));
                                                          break; }
             }
            (*param).nserv=&(client[i]);
            (*param).idServ=i;
            (*param).conn=connessione;
            (*param).clientAddr.sin_family = AF_INET;
            (*param).clientAddr.sin_addr.s_addr=Client_addr.sin_addr.s_addr;
            (*param).clientAddr.sin_port=Client_addr.sin_port;

            ListaServer[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)server,param,0,&ServID[i]);

	    }

   shutdown(listenSocket,2);
   close(listenSocket);

   WSACleanup();

   return 0;

}

dove server e la struttura a cui punta param sono definite così:

codice:
DWORD WINAPI server(serv_arg* param);

typedef struct serv_arg{
  SOCKET conn;
  SOCKADDR_IN clientAddr;
  int idServ;
  LONG volatile* nserv;} serv_arg;