Questo è il template (assolutamente portabile, a differenza delle funzioni pure di Winsock o dell'uso di MFC) che uso per i server, l'unica cosa da cambiare è la funzione LANCIA_UN_THREAD e il fatto di usare dei metodi (dipendenti dal sistema) per ricevere segnalazioni di fine del programma (altrimenti dal loop non esci mai)
Ah, in windows devi includere solo l'header <windows.h> e <winsock2.h>codice:#define SERVERPORT 10202 /* la porta TCP da usare */ #define MAX_CONN_PENDING 5 /* max connessioni in attesa del server */ void main () { int sfd, tfd; int i; struct sockaddr_in sa, isa; struct hostent *hp; /* chiede l'indirizzo del local host */ gethostname(localhost,MAXHOSTNAME); if ((hp=gethostbyname(localhost))==NULL) { perror("Impossibile ottenere nome host locale\n"); exit(1); } /* inserisce il socket number dentro la struttura del socket */ sa.sin_port=htons((short int) SERVERPORT); /* costruisce la struttura che contiene l'indirizzo del local host */ memcpy(&sa.sin_addr, hp->h_addr, hp->h_length); sa.sin_family=hp->h_addrtype; /* richiede un descrittore di socket */ if (( sfd=socket(hp->h_addrtype, SOCK_STREAM, 0))<0 ) { perror ("errore apertura socket \n"); exit(1); } /* fa il bind alla service port */ if (bind(sfd,(struct sockaddr*) &sa, sizeof (sa))<0) { perror("bind rifiutato\n"); exit(1); } /* massimo numero di connessioni accettate */ listen(sfd, MAX_CONN_PENDING); /* SERVER LOOP */ while (1) { i=sizeof (isa); if (( tfd=accept(sfd,(struct sockaddr*) &isa, &i))<0) { perror("errore accept \n"); exit(1); /* in tfd ho il file descriptor della connessione */ LANCIA_UN_THREAD_PER_ESEGUIRE_LA_RICHIESTA(tfd); } }
inoltre devi sempre scrivere nella main, prima di richiamare qualunque funzione socket, il seguente codice (copiato e incollato da MSDN
codice:#ifdef WIN32 //code from MSDN WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ printf("Necessaria versione 2 di winsock\n"); return ; } /* Confirm that the WinSock DLL supports 2.2.*/ /* Note that if the DLL supports versions greater */ /* than 2.2 in addition to 2.2, it will still return */ /* 2.2 in wVersion since that is the version we */ /* requested. */ if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ printf("Necessaria versione 2 di winsock\n"); WSACleanup( ); return ; } #endif

Rispondi quotando