#include <cstdlib>
#include <winsock.h>
#include <windows.h>
#include <iostream>
using namespace std;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
WSAData wsaData;
/*
Struttura dell'elemento WSAdata
int WSA startup {
WORD wVersionRequested,
LPWSADATA lpWSAdata
}
*/
WORD wVersionRequested = MAKEWORD(2 , 0); //Specifico la versione della libreria Winsock.h.
int start = WSAStartup(wVersionRequested, &wsaData);
//Qui controllo se l'inizializzazione della libreria è andata a buon fine.
if(start != 0) {
MessageBox(0,"Errore nella fase di inizializzazione della libreria winsock.h","WSAdata", MB_OK | MB_ICONERROR);
WSACleanup();
return 0;
}
else {
MessageBox(0,"Libreria Winsock inizializzata correttamente","WSAdata", MB_OK | MB_ICONINFORMATION);
}
/* struttura della funzione socket
SOCKET socket(int af
address_family
AF_INET,
int type
tipo di socket (SOCK_STREAM[TCP])
int protocol
protocollo[0]);
*/
//creo l'oggetto NewSock;
NewSock = socket(AF_INET, SOCK_STREAM, 0);
//verifico la presenza di errori nell'apertura
if(NewSock == INVALID_SOCKET) {
MessageBox(0,"Errore nella fase di apertura della socket","SOCKET obj",MB_OK | MB_ICONERROR );
WSACleanup();
return 0;
}
else {
MessageBox(0,"Oggetto socket creato correttamente","SOCKET obj", MB_OK | MB_ICONINFORMATION);
}
/*Funzione bind(), ovvero identifico il socket.
int bind ( SOCKET s
Descrizione del socket,
const struct sockaddr* name
indirizzo da assegnare alla socket,
int namelen
lunghezza in byte dle nome);
struttura di sockaddr_in
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
*/
//il nome assegnato è "service", di cui poi si calcola la lunghezza in byte.
//int bind(NewSock, (SOCKADDR*)&service, sizeof(service));
struct sockaddr_in service;
/*
struct addr_in {
unsigned long s_addr; (indirizzo internet, ip)
}
*/
//assegno dei valori all'oggetto sockaddr_in [struttura di prima].
service.sin_family = AF_INET; //protocollo
service.sin_port = htons(21); //porta forse.
service.sin_addr.s_addr = INADDR_ANY; //indirizzo di residenza[inet_addr converte la stringa]
int Check = bind(NewSock, (struct sockaddr*)&service, sizeof(service));
//controllo la presenza di errori
if(Check != 0) {
MessageBox(0,"Errore durante l'esecuzione della funzione di valorizzazione","bind() function",MB_OK | MB_ICONERROR);
WSACleanup();
return 0;
}
else {
MessageBox(0,"Funzione bind() eseguita correttamente","bind() function", MB_OK | MB_ICONINFORMATION);
}
/*il server si mette in ascolto e aspetta le connesioni
int listen(SOCKET s, int BACKLOG);
SOCKET s = descrittore del socket
BACKLOG = numero massimo di connessioni in attesa di risposta
*/
//int listen(NewSock, 1);
int VarListen = listen(NewSock, 1);
if(VarListen != 0) {
MessageBox(0,"Errore durante la fase di ascolto","listen() function",0);
WSACleanup();
return 0;
}
/*Consente le connessioni ai client.
funzione accept(SOCKET s
identifica il socket,
struct sockaddr* addr
riceve l'indirizzo ip del client e lo memorizza in un buffer,
int addrlen
contiene la lunghezza dell ip che fa la richiest );
restituisce una socket temporanea
*/
SOCKET AcceptSocket;
struct sockaddr_in AcceptSocket_addr;
cout << "Ora il server e' pronto per accettare delle connessioni\n";
int lunghezza = sizeof(struct sockaddr);
for(int i; ;i++) {
AcceptSocket = accept(NewSock, (struct sockaddr*)&AcceptSocket_addr, &lunghezza);
if(AcceptSocket==0) break;
}
NewSock = AcceptSocket;
char msg[] = "Connessione avvenuta corretamente al primo server creato da Luca Tedesco";
send(AcceptSocket,msg,sizeof(msg),0);
closesocket(AcceptSocket);
closesocket(NewSock);
WSACleanup();
return 0;
}