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;