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;

Rispondi quotando