codice:
#include<windows.h>
#include<stdio.h>
#include<WinSock2.h>
#include<stdlib.h>
#include <pthread.h>
#include<wingdi.h>
#include<sys/types.h>
#include<errno.h>
#include<io.h>
#include<winuser.h>
#define LMITT 30
#define LOGG 150
#define LTEXT 500
#define PORTA 1101
#define LHOSTBUFF 1024
typedef struct {
char mittente[LMITT];
char oggetto[LOGG];
char testo[LTEXT];
int numeroMessaggio;
} Messaggio;
//VARIABILI GLOBALI
UINT mex_type_sosp=0;
char buffer[709];
Messaggio messaggio;
HWND titolo;
WNDCLASS parametriFinestra;
char* mesSospensione="...Sospensione...";
void exitWSA(int errorcode) {
WSACleanup();
exit(errorcode);
}
LRESULT CALLBACK WndProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_CREATE:
return 0;
case WM_CLOSE:
return 0;
default:
if(message==mex_type_sosp) {
printf("...sospendi connessioni... \n");
fflush(stdout);
exitWSA(1);
PostQuitMessage(0);
return 0;
}
else
return(DefWindowProc(hWindow,message,wParam,lParam));
}
}
void gestioneFinestre() {
//typedef struct tagWNDCLASS {
//UINT style;
//WNDPROC lpfnWndProc;
//int cbClsExtra;
//int cbWndExtra;
//HINSTANCE hInstance;
//HICON hIcon;
//HCURSOR hCursor;
//HBRUSH hbrBackground;
//LPCTSTR lpszMenuName;
//LPCTSTR lpszClassName;
//} WNDCLASS, *PWNDCLASS;
char nome[]="Bacheca_Elettronica";
//nuovo tipo di messaggio evento
mex_type_sosp=RegisterWindowMessage((LPCSTR)mesSospensione);
if(!mex_type_sosp) {
printf("ATTENZIONE: errore nella creazione del messaggio --> Client",GetLastError());
fflush(stdout);
}
//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)==0) {
printf("\n ATTENZIONE: errore nella creazione dell'evento --> Client \n");
fflush(stdout);
}
//creo la finestra
titolo=CreateWindow((LPCSTR)nome,
(LPCSTR)nome,
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 \n", GetLastError());
fflush(stdout);
ExitProcess(-1);
}
}
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() {
//DATI
int codiceAzione;
char buffer[800];
//GESTIAMO LA CREAZIONE E LA CONNESSIONE DELLA SOCKET
SOCKET socketClient;
struct sockaddr_in server_addr;
struct hostent* host;
server_addr.sin_family=PF_INET;
server_addr.sin_port=htons(PORTA); //PORTA UTILIZZATA PER LA CONNESSIONE DELLA SOCKET
//host=traduciHost("localhost");
server_addr.sin_addr.S_un.S_un_b.s_b1=127;
server_addr.sin_addr.S_un.S_un_b.s_b2=0;
server_addr.sin_addr.S_un.S_un_b.s_b3=0;
server_addr.sin_addr.S_un.S_un_b.s_b4=1;
if(!Init_WinSocket())
exitWSA(1);
//LA SOCKET SI CONNETTE TRAMITE CONNESSIONE TCP(SOCK_STREAM) E PROTOCOLLO TCP/IP (PF_INET)
if((socketClient=socket(PF_INET,SOCK_STREAM,0))<0) {
printf("Errore nella creazione della socket del client");
ExitProcess(-1); //CHIAMATA DI WIN32 CHE TERMINA NORMALMENTE IL PROCESSO
}
//PREPARIAMO LO SPAZIO DI MEMORIA CHE CONTERRà IL NOSTRO INDIRIZZO
printf("\n ...connessione al server in corso... \n");
if(connect(socketClient,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))==SOCKET_ERROR) {
printf("Errore nella connessione\n");
SendMessage(HWND_BROADCAST,mex_type_sosp,0,0);
ExitProcess(0);
}
else {
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n~~~~~~~~~~CONNESSI AL SERVER~~~~~~~~~~~~~\n");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
gestioneFinestre();
//PREPARO LO SPAZIO DI MEMORIA PER MEMORIZZARE IL MITTENTE
memset(&messaggio.mittente,'\0',sizeof(messaggio.mittente));
printf("Inserisci username");
while(1){
gets(messaggio.mittente); //CATTURA USERNAME DA CANALE DI INPUT STANDARD (TASTIERA)
if(strlen(messaggio.mittente)<=32) break;
printf("Inserisci username più breve");
}
printf("\n ...login in corso... \n");
if(send(socketClient, messaggio.mittente,strlen(messaggio.mittente),0)<0) {
printf("\n login non riuscito \n");
SendMessage(HWND_BROADCAST,mex_type_sosp,0,0);
ExitProcess(0);
}
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n~~~~~~~~~~~~LOGIN RIUSCITO~~~~~~~~~~~~~~~\n");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\nINSERISCI IL CODICE CORRISPONDENTE A CIò CHE VUOI FARE\n");
printf("\n Leggere ----> 1 \n");
printf("\n Scrivere ----> 2 \n");
printf("\n Cancellare ----> 3 \n");
printf("\n Uscire ----> 4 \n");
memset(&codiceAzione,'0',sizeof(codiceAzione));
scanf("%s",&codiceAzione);
fflush(stdin); //SU UNO STREAM DI INPUT TORNA EOF IN CASO DI ERRORE DI SCRITTURA, 0 ALTRIMENTI
switch(codiceAzione) {
case '1':
if(send(socketClient,"01",(strlen("01")+1),0)<0) {
printf("Errore invio codice\n");
SendMessage(HWND_BROADCAST,mex_type_sosp,0,0);
ExitProcess(0);
}
else letturaMessaggi(socketClient);
case '2':
if(send(socketClient,"02",(strlen("02")+1),0)<0) {
printf("Errore invio codice\n");
SendMessage(HWND_BROADCAST,mex_type_sosp,0,0);
ExitProcess(0);
}
else scritturaMessaggi(socketClient);
case '3':
if(send(socketClient,"03",(strlen("03")+1),0)<0) {
printf("Errore invio codice\n");
SendMessage(HWND_BROADCAST,mex_type_sosp,0,0);
ExitProcess(0);
}
else cancellazioneMessaggi(socketClient);
case '4':
if(send(socketClient,"04",(strlen("04")+1),0)<0) {
printf("Errore invio codice\n");
SendMessage(HWND_BROADCAST,mex_type_sosp,0,0);
ExitProcess(0);
}
else {
closeSocket(socketClient);
printf("\n~~~~~~~~~~~~~~SESSIONE CHIUSA~~~~~~~~~~~~~~~\n");
exitWSA(0);
}
}
} //CHIUSURA MAIN
e l'errore che mi da è undefined function to WinMain@16