claudia_brontola (Normal User)
Rookie
Messaggi: 40
Iscritto: 06/11/2012
|
ok arriva...
int _tmain(int argc,char * argv[])
{
//definizioni variabili
SOCKET list_s,conn_s;
short int port;
struct sockaddr_in server;
struct sockaddr_in their;
char buffer[MAX];
char * endPtr;
int sin_size;
WSADATA wsaData;
DWORD nThread;
HWND hWind;
WNDCLASS wndClass;
MSG msg;
HANDLE th;
puts("# PRENOTAZIONE CINEMA SERVER #");
puts(" Avvio server.....");
// registrazione messaggi di errore
my_mex_type=RegisterWindowMessage((LPCWSTR)message);
if(!my_mex_type)
{
printf("error");
exit(-1);
}
mex=RegisterWindowMessage((LPCWSTR)stop);
if(!mex)
{
printf("error");
exit(-1);
}
//inizializzazione WindClass per gestione segnali
wndClass.style= CS_HREDRAW | CS_VREDRAW ; // stile della finestra
wndClass.lpfnWndProc=WndProc; //funzione che funge da handler per tutti i segnali
wndClass.cbClsExtra=0; //byte da allocare per esigenze programmatore
wndClass.cbWndExtra=0; //come sopra
wndClass.hInstance=NULL; //handler all'istanza del processo lanciato
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); // handler icona da utilizzare
wndClass.hCursor=LoadIcon(NULL,IDC_ARROW); //handler a cursore da usare in finestra
wndClass.hbrBackground=(HBRUSH) GetStockObject(WHITE_BRUSH); //handle al pennello di background
wndClass.lpszMenuName=NULL; // nome da usare per il menù
wndClass.lpszClassName=(LPCWSTR)"server"; //nome associato alla finestra
//inizializzazione RegisterClass & finestra per la ricezione segnali
if(!(RegisterClass(&wndClass)))
{
printf("errore nella registrazione della classe");
fflush(stdout);
exit(-1);
}
/* senza la creazione di questa finistra NON visibile,non si potrebbe ricevere segnali */
hWind =CreateWindow((LPCWSTR)"server", (LPCWSTR)"Gestione",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL,NULL);
if(hWind==INVALID_HANDLE_VALUE)
{
printf("server: errore nella creazione finestra");
fflush(stdout);
exit(-1);
}
// interpretazione riga di comando
ParseCmdLine(argc,argv,&endPtr);
//creazione socket
/*strtol convert un char in un long int */
port= strtol(endPtr,&endPtr,0);
if(*endPtr)
{
fprintf(stderr,"server: porta non riconosciuta");
exit(EXIT_FAILURE);
}
printf("server: in ascolto sulla porta %d \n", port);
/*wsStartup inizializza l'utilizzazione delle Windows Socket */
if( WSAStartup (MAKEWORD (1,1) , &wsaData) !=0)
{
printf("errore in WSA startup");
exit(EXIT_FAILURE);
}
/* creazione socket*/
if((list_s=socket (AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
fprintf(stderr,"server:errore apertura socket"); //flusso di errore è la destinazione per per i messaggi di errore
exit(EXIT_FAILURE);
}
//bind e listen su socket
/*memset setta i primi n bytes della locazione puntata dal puntatore passato (nel nostro caso i bytes sono sizeof(buffer) e il puntatore &server) */
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(port);
//effettua la bind sull'indirizzo e la porta ora assegnate
if(bind(list_s,(struct sockaddr *)&server, sizeof(server))==SOCKET_ERROR)
{
fprintf(stderr,"server: errore nella bind");
exit(EXIT_FAILURE);
}
//mette la socket in ascolto tramite la listen
if(listen(list_s, LISTENQ)==SOCKET_ERROR)
{
fprintf(stderr,"server:errore nella listen");
exit(EXIT_FAILURE);
}
//creazione file
file =CreateFile((LPCWSTR)"codici",GENERIC_READ,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
//loop
while(1)
{
//attende una nuova connessione tramite la accept
sin_size=sizeof(struct sockaddr_in);
if((conn_s=accept(list_s,(struct sockaddr *)&their,&sin_size))==INVALID_SOCKET)
{
fprintf(stderr, "server: errore nella accept");
exit(EXIT_FAILURE);
}
printf("server: connessione da %s \n", inet_ntoa(their.sin_addr));
//thread per la comunicazione con client
th=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) receiveThread,(LPVOID) conn_s,NORMAL_PRIORITY_CLASS,&nThread);
//loop per la ricezione dei messaggi
while(PeekMessage(&msg,hWind,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
|