/****************************
Sorgenti della guida
www.fabrixosft.altervista.org
www.pierotofy.it
***************************/
#include <stdio.h>
#include <winsock.h>
main(){
//INIZIALIZZAZIONE WINSOCK
WSADATA wsadata;
int Versione= WSAStartup(MAKEWORD(2,2),&wsadata);
//Gestione dell'errore
if(Versione!=NO_ERROR){ //o anche if(Versione != 0){
printf("Errore nell'inizializzazione delle socket");
}
//***************************************
//DICHIARAZIONE E CREAZIONE DELLA SOCKET
//Dichiariamo la SOCKET che verrà chiamata server
SOCKET server;
//Associamo alla socket "AF_INET", ovvero internet adress family (il più usato), "SOCK_STREAM", per far girare la socket sul protocollo TCP(esiste anche il tipo "SOCK_DGRAM" per usare la socket su un protocollo UDP),IPPROTO_TCP , ovvero la socket userà il protocollo TCP
server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//gestione dell'errore
if(server==INVALID_SOCKET){
printf("Errore: Socket non valida");
//Liberiamo le risorse della socket
WSACleanup();
}//*************************************
//STRUTTURA SOCKADDR_IN E ASSEGNAZIONE DI PARAMETRI AL SERVER
SOCKADDR_IN parametri_server;
//Come detto prima passiamo la internet address family
parametri_server.sin_family=AF_INET;
//ora diciamo su che indirizzo IP il server deve attivarsi, in questo caso 127.0.0.1 ovvero l'host locale
parametri_server.sin_addr.s_addr = INADDR_ANY; //In questo modo faremo collegare da remoto il clien altrimenti mettere "inet_addr("127.0.0.1");"
//Ora passiamo al server la porta di connessione, in questo caso la 1000
parametri_server.sin_port=htons(1000);
//************************************************************
//FUNZIONE BIND
int funzione_bind;
funzione_bind=bind( server, (SOCKADDR*) ¶metri_server, sizeof(parametri_server));
if(funzione_bind ==SOCKET_ERROR ){
/*if(bind!=0){
printf("Funzione bind non riuscita\\n");*/
//Chiudiamo correttamente la socket
printf("Errore\n");
closesocket(server);
WSACleanup();
}
//****************************************************
//FUNZIONE LISTEN(); RIMANE IN ASCOLTO
int funzione_listen;
funzione_listen=listen(server,1);
if(funzione_listen ==SOCKET_ERROR)
//Gestione dell'errore
printf("Errore nella funzione listen \n");
//************************************
//FUNZIONE ACCEPT(); ACCETTA LA CONNESSIONE
//Creiamo un elemento di tipo SOCKET
SOCKET Accetta_connessioni;
//ciclo infinito che attende la connessione
printf("Attendo la connesione d un client\n");
while(1){
//dichiariamo la SOCKET Accetta_connessioni come errore ...
Accetta_connessioni=ERROR;
//in modo da innestare un altro ciclo while che si interrompe solo quando la SOCKET Accetta_connessioni non è più ERROR, ovvero finchè non avviene la connessione con un client.
while(Accetta_connessioni==ERROR){
//La struttura della accept deve prendere 3 parametri, l primo obbligatorio e gli altri opzionali, a noi interessa solo il primo parametro(ovvero SOCKET server) e in questa guida non spiegherò a cosa servono gli altri 2 che setteremo a NULL
Accetta_connessioni=accept(server,NULL,NULL);
}
//Se il ciclo si interrompe significa che un client si è connesso
printf("Un client ha effettuato una connessione!");
//Assegnamo alla SOCKET server la socket Accetta_connessioni.
server=Accetta_connessioni;
//con un break; usciamo dal ciclo infinito
break;
}
//********************************
//FUNZIONE RECV PER LA RICEZIONE DEI DATI
//Dichiariamo il buffer contenente i dati ricevuti
int ricevuto;
char ricezione_dati[100];
do{
//Funzione recv per ricevere i dati
recv(server,ricezione_dati,100,0);
//Outputiamo i dati ricevuti
printf("\nHo ricevuto >>> %s ",ricezione_dati);
//Il ciclo continua finchè non viene digitato "Chiuditi"
}while(strcmp(ricezione_dati,"Chiuditi")!=0);
getchar();
//*************************************
}