codice:
#pragma comment (lib, "Ws2_32.lib")
#include<Windows.h>
#include<stdio.h>
#include<winSock2.h>
#include<stdlib.h>
#include <pthread.h>
#define LMITT 30
#define LOGG 150
#define LTEXT 500
#define PORTA 1101
#define LBUFF 10
#define LMAX (LMITT+LOGG+LTEXT)
#define FILENAME "bacheca.txt"
typedef struct {
char mittente[LMITT];
char oggetto[LOGG];
char testo[LTEXT];
int numeroMessaggio;
} Messaggio;
//VARIABILI GLOBALI
SOCKET socket_server;
SOCKET connessione;
Messaggio messaggio;
int codiceAzione;
int flag=0; //DA VERIFICARE!!!
HANDLE bacheca;
DWORD tid;
FILE fileAppoggio;
int contatoreMessaggi=1;
HANDLE thred_lavoratore;
char nome[]="Bacheca_Elettronica";
WNDCLASS parametriFinestra;
char* mesSospensione="...Sospensione...";
UINT mex_type_sosp=0;
HWND titolo;
LRESULT CALLBACK WndProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_CREATE:
return 0;
default:
if(message==mex_type_sosp) {
printf("...impossibile comunicare con il client... \n");
flag=1;
closesocket(socket_server); //VERIFICARE SE FUNZIONA CON SOCKET_SERVER
ExitThread(0);
}
else
return(DefWindowProc(hWindow,message,wParam,lParam));
}
}
void gestioneFinestre() {
//nuovo tipo di messaggio evento
mex_type_sosp=RegisterWindowsMessage((LPCSTR)mesSospensione);
if(!mex_type_sosp) {
printf("ATTENZIONE: errore nella creazione del messaggio --> Server",GetLastError());
fflush(stdout);
ExitProcess(-1);
}
//settiamo i parametri della finestra
parametriFinestra.style=CS_HREDRAW|CS_VREDRAW;
parametriFinestra.lpfnWndProc=WndProc;
parametriFinestra.cbClsExtra=0;
parametriFinestra.cbWndExtra=0;
parametriFinestra.hIcon=LoadIcon(NULL,IDI_APPLICATION);
parametriFinestra.hInstance=NULL;
parametriFinestra.hCursor=LoadIcon(NULL,IDC_ARROW);
parametriFinestra.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
parametriFinestra.lpszClassName=(LPCSTR)nome;
parametriFinestra.lpszMenuName=NULL;
//creo un evento
if(!RegisterClass(¶metriFinestra)) {
printf("\n ATTENZIONE: errore nella creazione dell'evento --> Server \n");
fflush(stdout);
}
//creo la finestra
titolo=CreateWindow((LPCSTR)nome,
(LPCSTR)"Bacheca Elettronica",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, NULL, NULL, NULL);
if(titolo==INVALID_HANDLE_VALUE) {
printf("\n ATTENZIONE: errore nella creazione della finestra --> Server \n", GetLastError());
fflush(stdout);
ExitProcess(-1);
}
}
void letturaMessaggi(SOCKET connessione, HANDLE bacheca) { //VERIFICARE --> AL POSTO DI DS_SOCKET POTREBBE ANDARCI LA SOCKET VERA E PROPRIA!!
//VARIABILI LOCALI AL METODO
int dim_file;
char dimensione[LBUFF];
int contatore=0;
char dati[LMAX];
DWORD datiLetti=0;
printf("\n ...lettura messaggi in corso... \n");
if((dim_file=SetFilePointer(bacheca,0,0,FILE_END))==INVALID_SET_FILE_POINTER) { //ACQUISISCO LA DIMENSIONE DEL FILE DA INVIARE AL CLIENT
printf("\n ATTENZIONE: non si può determinare la dimensione del file! \n");
}
itoa(dim_file,dimensione,15); //converte dimensione_file in una stringa dimensione per poterla inviare al server
if(write(connessione,dimensione,sizeof(dimensione),0)<0) {
printf("\n ATTENZIONE: errore nell'invio dimensione del file \n");
flag=0;
//PostMessage(hWindow,mex_type_sosp,0,0);
ExitThread(-1);
}
//LEGGIAMO IL FILE DA INVIARE AL CLIENT
if(SetFilePointer(bacheca,0,0,FILE_BEGIN)==INVALID_SET_FILE_POINTER) printf("\n ATTENZIONE: errore nel riposizionamento del file pointer \n");
while(contatore<dim_file) {
memset(&dati,0,sizeof(dati));
if(ReadFile(bacheca,&dati,LMAX,&datiLetti,0)==0) printf("\n ATTENZIONE: errore nella lettura del file \n");
printf("\n ...invio dati in corso... \n");
int invio=write(connessione,dati,sizeof(dati),0);
if(invio<0) {
printf("\n ATTENZIONE: errore nell'invio dei dati al client \n");
flag=0; //DA VERIFICARE
//PostMessage(hWindow,mex_type_sosp,0,0);
ExitThread(-1);
}
contatore=SetFilePointer(bacheca,0,0,FILE_CURRENT); //RIPOSIZIONA IL FILE POINTER DAL PUNTO IN CUI ERA ARRIVATO
if(contatore==INVALID_SET_FILE_POINTER) printf("\n ATTENZIONE: errore nel riposizionamento del file_pointer \n");
} //FINE DEL FILE
printf("\n BACHECA INVIATA CORRETTAMENTE AL CLIENT \n");
}
DWORD WINAPI lavoro(void* no_value) {
//VARIABILI LOCALI AL METODO
//INIZIALIZZAZIONE VARIABILI LOCALI
//IDENTIFICHIAMO L'UTENTE
memset(&messaggio.mittente,0,sizeof(messaggio.mittente));
if(read(connessione,messaggio.mittente,sizeof(messaggio.mittente),0)<0) {
printf("\n ATTENZIONE: errore nella ricezione del mittente \n");
flag=0; //VERIFICARE A COSA SERVE!!!!!
ExitThread(1);
}
else {
printf("MITTENTE: \n");
printf("%s\n",&messaggio.mittente);
}
//RICEVIAMO LA RICHIESTA FATTA AL SERVER
while(1) {
if(read(connessione,messaggio.mittente,sizeof(codiceAzione),0)<0) {
printf("\n ATTENZIONE: la richiesta non è stata ricevuta \n");
flag=1; //VERIFICARE
ExitThread(1);
}
else {
printf("\n La richiesta ricevuta è: \n");
printf("%s\n", &codiceAzione);
}
switch(codiceAzione) {
case '1':
letturaMessaggi(connessione,bacheca);
case '2':
scritturaMessaggi(connessione,bacheca);
case '3':
cancellazioneMessaggi(connessione,bacheca);
case '4':
printf("\n SESSIONE CHIUSA \n");
if(closesocket(connessione)==SOCKET_ERROR) {
printf("\n ATTENZIONE: errore nella chiusura della socket \n");
flag=1;
ExitThread(0);
}
}
}
}
int Init_WinSocket(void) {
WSADATA data; //contiene le primitive di winSock
WORD w;
int err=0; //gestisce gli errori
w=MAKEWORD(2,2); //la variabile w contiene la versione della wsock32.dll
err=WSAStartup(w,&data); //inizializzo la wspck32.dll verificando la mancanza di errori
if(err!=0) {
printf("WSAStartup fallito \n");
return 0;
}
return 1;
}
int main() {
//VARIABILI LOCALI AL MAIN
HANDLE thread_lavoratore;
int stato_thread;
struct sockaddr_in server;
struct sockaddr_in client;
int descrittore_server;
int descrittore_client;
//GESTIAMO LA CONNESSIONE DEL SOCKET DEL SERVER
memset(&server,0,sizeof(server));
printf("\n ...inizializzazione server... \n");
server.sin_family=AF_INET;
server.sin_port=htons(PORTA);
server.sin_addr.s_addr=htonl(INADDR_ANY); //INADDR_ANY SPECIFICA CHE POSSO RICEVERE CONNESSIONI DA QUALSIASI INDIRIZZO
if(!Init_WinSocket())
exitWSA(1);
if((descrittore_server=socket(AF_INET, SOCK_STREAM,0))<0) {
printf("\n ATTENZIONE: errore nella creazione della socket --> Server \n");
exit(-1);
}
//FACCIAMO LA BIND!!
//ASSOCIA INDIRIZZO ALLA SOCKET
int esito_bind=bind(socket_server, (struct sockaddr *)&server, sizeof(server));
if(esito_bind<0) {
printf("\n ATTENZIONE: c'è stato un errore nella bind --> Server \n");
exit(-1);
}
//METTIAMO IL SERVER IN ASCOLTO DI RICHIESTE DA PARTE DEL CLIENT
if(listen(socket_server,1)==SOCKET_ERROR) {
printf("\n ATTENZIONE: errore nella funzione listen --> Server \n");
exitProcess(0);
}
int LClient = sizeof(client);
while(1) {
printf("\n ...accettazione del client... \n");
connessione=accept(socket_server, (struct sockaddr *)&client, &LClient);
if(descrittore_client<0) {
if(errno!=EINTR) {
printf("\n ATTENZIONE: errore accept --> Server \n");
exit(-1);
}
}
else {
void *desc = (void *) &descrittore_client;
//ATTIVIAMO IL THREAD CHE FARà IL LAVORO DEL SERVER
if((thread_lavoratore=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)lavoro,NULL,NORMAL_PRIORITY_CLASS,&tid))==INVALID_HANDLE_VALUE) {
printf("\n ATTENZIONE: errore nella creazione del thread --> Server \n");
ExitProcess(0);
}
}
}
}
e gli errori che mi da...