Crea il tuo forum GRATIS su GlobalFreeForum.com.

Networking by Rom3ocrash

Sezione dedicata alle guide riguardanti il mondo informatico

Moderatori: Gruppo Admin, Gruppo Mod

Networking by Rom3ocrash

Messaggioda Rom3oCrash » 02/02/2013 - 16:40

come promesso ecco la mia guida, non è completa ma preso la continuerò
Prima ti tutto vi voglio dare un introduzione ai principi di base della rete e ai suoi termini.
Chiunque abbia accesso ad Internet avrà già sentito parlare di reti, server, client, ma per essere sicuri di sapere abbastanza da poter creare programmi che interagiscano con la rete ho voluto creare questo capitolo introduttivo per poi dedicarci ad Winsock (tutti gli esempi di codice che userò saranno scritti in c++ ma comunque dal punto di vista teorico si può applicare tutto a qualsiasi linguaggio)

Reti e protocolli

Esistono in generale due tipi di reti. Le reti a commutazione di circuito (le vecchie reti telefoniche per intenderci) dove un circuito reale o virtuale (ATM) viene stabilito tra sorgente e destinazione e nel quale vengono immessi i dati (la voce nel caso delle vecchie reti telefoniche o le celle ATM). Poi esistono le reti a commutazione di pacchetto dove ogni pacchetto viaggia di nodo in nodo attraverso internet ed arriva alla destinazione senza l'utilizzo di nessun circuito virtuale. Possiamo dire che il pacchetto "trova" (passatemi il termine) la strada per la destinazione fra queste troviamo reti LAN (Local Area Network), WAN (Wide Area Network) e naturalmente Internet.Al fine di garantire che tutto il traffico proceda in modo corretto, le reti si basano su protocolli.

Protocolo
Un protocollo è un insieme di regole che descrivono il modo in cui due entità possono comunicare.

Come indicato qui sopra un protocollo descrive come comunicare in rete. Esso può essere confrontato con un linguaggio umano: al livello più basso quasi tutti possono fare e sentire i suoni (nel caso della rete: segnali elettronici), ma la gente non capisce l’altro, a meno che non parlino secondo un linguaggio specifico che entrambi capiscono (nel caso della rete: protocollo).

Ethernet

Le reti si basano su livelli di protocollo diversi, ognuno con il proprio compito nel processo di comunicazione. Una configurazione comunemente usata è la LAN Ethernet con protocollo TCP/IP. In Ethernet LAN, i computer possono essere collegati tramite cavo coassiale, cavo non schermato (UTP) o cavi di fibre ottiche. Oggigiorno, per la maggior parte delle reti, vengono utilizzati cavi UTP . WAN e Internet (in parte una combinazione di molte WAN) utilizzano molte delle tecniche usate in ethernet LAN ma certi internet service provider (ISP) utilizzano per la connessione verso la rete WAN lo standard PPPoA (Point to Point Protocol over ATM). Lo stesso vale per le fibre ottiche... gli standard sono tanti e diversi (GMPLS, WDM, SDH, ecc.)
MAC

Media Access Control (MAC) è lo strato che contiene, funzionalità di framing, controllo di errore e funzionalità di controllo dell'accesso al mezzo fisico per canali broadcast. Lo standard ethernet utilizza CSMA/CD (Carrier Sense Multiple Access with Collision Detection) mentre lo standard 802.11 utilizza CSMA/CA. Un ulteriore servizio che il livello di collegamento fornisce è il controllo degli errori tramite CRC. Ora dal tipo di rete fisica sottostante dipende il funzionamento della rete a livello 2 (data link). Fa parte del livello datalink di cui rappresenta il sottolivello inferiore sovrastato dal sottolivello LLC e limitato inferiormente dal livello fisico. Le varie caratteristiche di questo strato vengono descritte dalla terza parte dello standard in poi.
È il livello a cui trova sede l'indirizzo MAC o indirizzo fisico del calcolatore.

I pacchetti che vengono inviati su una rete, naturalmente, devono raggiungere la loro destinazione. Quindi ci deve essere un qualche tipo di indirizzamento. I livelli del interfaccia ethernet hanno differenti metodi di indirizzamento, come si vedrà in seguito. Al livello più basso (MAC) l’indirizzamento è fatto con i numeri MAC.

Indirizzo MAC

è un codice di 48 bit assegnato in modo univoco dal produttore ad ogni scheda di rete ethernet prodotta al mondo, tuttavia modificabile a livello software.L’indirizzo MAC si scrive normalmente in 6 ottetti separati da un trattino (es. 00-50-FC-A0-67-2C) ed i primi 3 ottetti sono detti OUI (Organizationally Unique Identifier)

Per inviare un pacchetto ad un’altra interfaccia di rete, il pacchetto deve includere l’indirizzo MAC. LAN utilizza un metodo molto semplice per inviare i pacchetti al interfaccia: radiodiffusione. Ciò significa che la scheda di rete invia il pacchetto solo ad ogni altra interfaccia che può raggiungere. Ogni interfaccia di ricezione guarda l’indirizzo MAC di destinazione del pacchetto e buffer solo se corrisponde a un proprio indirizzo MAC. Anche se questo metodo è facile da implementare e molto efficace su reti LAN, grandi reti (WAN, Internet) non utilizzare questo metodo per ovvi motiv,. WAN utilizzare meglio i meccanismi di routing, che non voglio discutere qui. Basta ricordare che al livello più basso, l’indirizzamento è fatto con i numeri MAC. Pacchetti Ethernet includono anche un CRC e rilevamento degli errori.

IP

IP sta semplicemente per Internet Protocol. Proprio come il livello MAC, IP ha il suo modo di rivolgendosi:

indirizzo IP
Immagine

IPv4, la versione più diffusa è costituito da 32 bit suddiviso in 4 gruppi da 8 bit, separati ciascuno da un punto (notazione dotted) (es. 11001001.00100100.10101111.00001111). Ciascuno di questi 4 byte è poi convertito in formato decimale di più facile identificazione (quindi ogni numero varia tra 0 e 255 essendo 2^8=256). Un esempio di indirizzo IPv4 è 195.24.65.215. A differenza dei numeri MAC, indirizzi IP non sono codificato permanentemente nell’hardware, ma sono attribuiti a livello software.


I numeri IP non dovrebbe essere qualcosa di strano per te. Internet li utilizza per identificare in modo univoco un interfaccia di rete specifica. gli indirizzi IP possono essere assegnati ad una interfaccia di rete tramite software.In questo modo si associa l’indirizzo IP al’indirizzo MAC dell’interfaccia di rete. Per risolvere utilizzando numeri IP, il numero MAC associato deve essere risolto. Questo viene fatto con l’ARP (Address Resolution Protocol). Ogni host gestisce un elenco con coppie di indirizzi IP e MAC. Se un IP viene utilizzato senza un indirizzo MAC corrispondente l’host invia un pacchetto query al resto della LAN. Se uno qualsiasi degli altri computer della LAN riconoscere il proprio indirizzo IP, invia il numero MAC corrispondente. Se non si trova nessun indirizzo MAC corrispondente il pacchetto viene inviato al gateway, un computer che inoltra i pacchetti alle reti esterne. La conversione da IP a MAC viene fatta in realtà in livello di collegamento dati (livello MAC)

Il protocollo IP aggiunge l’indirizzo di origine e di destinazione (numeri IP) per il pacchetto, così come alcune altre proprietà del pacchetto come il TTL hops (time to live hops), la versione del protocollo utilizza, header checksum, sequence count ma non sono importanti per noi, quindi non li spiegherò in dettaglio.

TCP

Il livello successivo è il livello TCP (oppure, il livello UDP). Questo livello è molto vicino alla applicazione di rete e si occupa di molte cose. Come tocco finale al indirizzamento, TCP aggiunge un numero di porta per il pacchetto:

Numero di porta
Mentre gli indirizzi IP vengono utilizzati per indirizzare ad uno specifico computer o dispositivo di rete, i numeri di porta sono utilizzati per identificare quale processo in esecuzione su tale dispositivo deve ricevere il pacchetto.I numeri di porta sono a 16 bit, e dunque limitati a 65536 numeri. Un processo può registrarsi per ricevere i pacchetti inviati a un numero di porta specifico (‘sta in ascolto’).Un modo molto usato per scrivere la porta utilizzata è la formula ’IP: numeroporta’, ad esempio. 209.217.52.4:80



Molti numeri di porta sono WKP (Well Known Ports), cioè che sono comunemente associati con un servizio specifico.Ad esempio, il WWW utilizza la porta 80 per impostazione predefinita, FTP utilizza la porta 21, e-mail utilizza 25 (SMTP) e 110 (POP). Anche se queste sono le porte solitamente utilizzate per tali servizi, nessuno ti impedisce di utilizzare porte diverse. Tuttavia, è una buona pratica di utilizzare numeri di porta superiori a 1024 per altri servizi personalizzati.

Mentre l’IP non si preoccupa per successo del trasferimento dei dati TCP lo fa. Il livello TCP assicura che i dati arrivino a destinazione nel modo giusto cioè consente il monitoraggio del flusso dei dati in arrivo. il ricevitore può decidere quando ricevere i dati. Se un pacchetto viene perso durante il tragitto al destinatario, TCP invia di nuovo il pacchetto. TCP riordina i pacchetti se arrivano in un ordine diverso da quello dell’ordine originale. Questo rende la vita del programmatore UDP, un’alternativa per TCP, non ha queste caratteristiche e non può garantire l’arrivo dei pacchetti. TCP è orientato alla connessione, e la scelta migliore per i flussi di dati continui. UDP invece è senza connessione, e pacchetti orientata. Non ci si occuperà di UDP in questo tutorial.

SOFTWARE

Infine, sopra lo strato TCP è il software di rete. In Windows, l’applicazione non accedere direttamente al livello TCP, ma utilizza l’API WinSock. Il livello software fornisce un modo molto conveniente di trattare con la rete. Grazie a tutti i livelli sottostanti, non è necessario preoccuparsi di pacchetti, dimensione dei pacchetti di dati, la corruzione, reinvio di pacchetti persi, ecc

Ethernet interface stack

Immagine

L’immagine sopra mostra l’incapsulamento del protocollo ogni stack del interfaccia ethernet.Tutto inizia con il livello software, che ha un pezzo di dati che vuole inviare in rete. Anche questi dati di solito ha un formato (es. protocolli HTTP, FTP), sebbene non mostrato nell’immagine. Il dato del utente prende prima un’intestazione TCP tra cui l’origine e il numero di porta di destinazione. Quindi viene aggiunto l’intestazione IP, contenente la fonte e l’indirizzo IP di destinazione. Infine, il livello di collegamento dati aggiunge l’intestazione ethernet, che specifica l’indirizzoo MAC di origine e di destinazione.Questo è il dato che viene effettivamente inviato sui fili. Come si può vedere ce un sacco di sovraccarico in un pacchetto TCP / IP. Il sovraccarico può essere minimizzato scegliendo una dimensione abbastanza grande grande per il pacchetto di dati. Per fortuna winsock organizzerà tutto per voi.


Ora che conoscete i livelli di base dell’interfaccia di rete, vorrei continuare con alcuni principi in materia di host, connessioni e protocolli a livello software.


1) DNS




DNS è l’acronimo di Domain Name System, che rappresenta la conversione dei nomi di host da e verso indirizzi IP. Visto che gli indirizzi IP non sono facili da ricordare (beh non molti almeno), è stato creato un altro sistema di denominazione più conveniente. Ora, invece di un indirizzo IP, è possibile utilizzare un hostname in alternativa. Esempi di nomi di host sono: hackerforum.globalfreeforum.com, http://www.google.com, ecc. Chiunque naviga in internet li ha usati. Quando ci si collega ad un sito web, il suo indirizzo IP è necessario. Quindi, se si immette un nome host come http://www.google.com, si deve in primo luogo cercare l’indirizzo IP corrispondente di google. Qui è dove entra in gioco il tuo DNS. Il tuo PC invia una richiesta di ricerca per il hostname al DNS del provider impostato nella rete. Se il DNS in grado di risolvere l’hostname, invia l’IP corrispondente a voi. I DNS sono organizzati in modo gerarchico, se un hostname è irrisolvibile viene trasmesso ad un DNS di livello superiore, fino a quando l’hostname viene risolto.

2) Connections

TCP / IP è un protocollo orientato alla connessione. La connessione è sempre tra due dispositivi, e ogni lato utilizza il suo IP e numero di porta. Di solito, un lato è chiamato client, l’altro lato server.

Immagine

Il client è quello che chiede qualcosa,e di conseguenza il server quello che da le informazioni.Per esempio, quando si apre un sito web, il browser è il client, il server web è il server(capitan ovvio xD). Il browser inizia la connessione con il server e richiede una risorsa specifica. Il server invia poi di nuovo una risposta e i dati richiesti.
Il server è continuamente in attesa di connessioni in ingresso. Questo è chiamato ascolto, che avviene sempre su un certo IP e numero di porta. Il client è attivo solo quando necessario, il cliente è sempre quello che richiede una connessione e quella che richiede informazioni. Per creare una connessione, il client deve conoscere sia l’IP sia il numero di porta del server in ascolto.
Viene effettuata una connessione al server che , si spera, viene accettata dal server. Mentre la comunicazione su una connessione TCP / IP è bidirezionale, molti procolli (HTTP, FTP, etc) fanno comunicare client e server a turni.Sia il server che lato client utilizza un IP e numero di porta, ma l’IP e il numero di porta del server di solito sono fissi.. La porta standard per il WWW è 80 (utilizzando il protocollo HTTP). Google per esempio, è un server web che gira sulla porta 80 e IP 173.194.35.23 (in questo momento), ogni volta che cerchiamo qualcosa su google il client si connette a questo IP e porta, così il webserver può avere molte connessioni sulla stessa porta, questo non è un problema, poiché tutto il traffico su quella porta è per lo stesso processo. Sul lato client, il numero di porta non ha importanza. Ogni porta può essere utilizzata. Alcune persone pensano che il numero di porta utilizzato in una connessione deve essere la stessa su entrambi i lati. Questo non è vero. Basta aprire un sito web e digitare ‘netstat-an’ in una riga di comando. Si potrebbe vedere una riga come questa:

TCP xxx.xxx.xxx.xxx:2894 173.194.35.23:80 ESTABLISHED

xxx.xxx.xxx.xxx è il mio IP, 173.194.35.23:80 è l’IP di Google. Il numero dopo i due punti è il numero di porta. Come si può vedere, il server utilizza la porta 80, mentre il client utilizza un a caso (2894). Ogni connessione client necessita di una potra sul lato client, poiché ogni connessione è associato a un diverso client.

quindi il parole povere

Client
è il programma che avvia la connessione, e richiede le informazioni
server
Il programma che è in ascolto per le connessioni in ingresso, le accetta e le risponde in base alle richieste pervenute. L’indirizzo IP e la porta del server devono essere conosciute dal client per connettersi ad esso.


P.S Nei capitoli precedenti ho mostrato diversi protocolli ai vari livelli di una interfaccia di rete. I protocolli di cui non ho ancora discusso sono i protocolli che lavorano a livello di software. Esempi di questi sono HTTP, FTP, POP3, SMTP. La maggior parte lavorano in un client-server, vale a dire. il client esegue richieste, il server risponde. Il formato esatto delle richieste e le risposte sono descritti in questi protocolli. Ora non ne discuterò ulteriormente, ma lo farò più tardi, quando si conosceranno le basi di Winsock/Soket e li implementeremo.

si ringrazia Lu@Hck88 per la partecipazione
init1.it
ogni 2 parole c'era un figlio di puttana in mezzo xDD

«C’è chi si gode la vita, c’è chi la soffre, invece noi la combattiamo».
Avatar utente
Rom3oCrash
Utente
Utente
 
Messaggi: 672
Iscritto il: 04/05/2011 - 18:47

Re: Networking by Rom3ocrash

Messaggioda Rom3oCrash » 03/02/2013 - 20:30

Sockets

Winsock (‘Windows Sockets’) è l’API di Windows che si occupa di networking. Molte funzioni sono implementate nello stesso modo come le funzioni sui socket Berkeley utilizzati in BSD Unix. (BSD è stato il primo ad introdurre i socket nel 1983 e poi sono stati ripresi da praticamente tutti gli altri sistemi operativi).Su linux invece viene utilizzata la libreria socket di cui parleremo in seguito.

Socket
quindi che cosa è un socket?
Come spiegato nel capitolo precedente, si lavorerà con due vie connessioni. I punti finali di questa connessione sono i socket. Sia il client e il server hanno un socket. Un socket è associato a un certo IP e numero di porta.

Quasi tutte le funzioni winsock operano sui socket, in quanto è l’handle per la connessione. Entrambi i lati della connessione utilizzare i socket, e non sono specifici della piattaforma (es. una macchina Windows e Unix possono comunicare tra loro utilizzando socket diversi). I socket sono anche bidirezionali, i dati possono essere inviati e ricevuti su un unico socket.
Ci sono due tipi comuni per un socket, uno è un socket di streaming (SOCK_STREAM), l’altro è un socket datagramma (SOCK_DGRAM). La variante di streaming è stato progettato per applicazioni che necessitano di una connessione affidabile, spesso utilizzando i flussi continui di dati. Il protocollo utilizzato per questo tipo di socket è TCP. Mi limiterò a usare questo tipo nel mio tutorial poichè è più comunemente usato per i protocolli ben noti come HTTP, TCP, SMTP, POP3, ecc
Datagram socket usa UDP come protocollo di base e hanno una dimensione massima del buffer. Essi sono destinati ad applicazioni che inviano dati in piccoli pacchetti e che non richiedono perfetta affidabilità. A differenza dei socket di streaming, i datagram socket non garantiscono che i dati raggiungeranno la loro destinazione, né che ci arriveranno nel giusto ordine. Datagram socket può essere leggermente più veloce e utile per le applicazioni quali streaming audio o video, in cui l’affidabilità non è in cima alla lista delle priorità. Dove è richiesta l’affidabilità,vengono utilizzati i socket streaming.
socket vincolanti
vincolare un socket significa associare un indirizzo specifico (IP e numero di porta) con un dato socket. Questo può essere fatto manualmente utilizzando la funzione bind, ma in alcuni casi winsock vincola automaticamente il socket.

Collegamento

Il modo in cui si utilizzano i socket dipende dal fatto che sono sul lato client o lato server.Il lato client inizia una connessione con la creazione di un socket, e chiamando la funzione di connessione con le informazioni di indirizzo specificato. Prima che il socket si colleghi, non è legato ancora ad un indirizzo IP o ad una porta.Poiché il lato client può utilizzare qualsiasi IP e numero di porta per la connessione con il server (purché l'indirizzo IP può raggiungere la rete del IP di destinazione),sono possibili molte combinazioni.
Quando si richiede una connessione, winsock sceglierà l'IP e numero di porta da utilizzare per la connessione e gli assocerà al socket prima che si colleghi effettivamente. Il numero di porta può essere tutto ciò che è libero in questo momento, per l'indirizzo il discorso è più complesso.i computer possono avere più di un IP.Ad esempio, un PC collegato sia a Internet sia una rete locale ha almeno tre IP (l'IP esterno per l'utilizzo con Internet, l'IP di rete locale (192.168.xx, 10.0.xx ecc) e l'indirizzo di loopback (127.0.0.1)). Non importa a quale IP il socket è associato in quanto determina anche la rete che si sta utilizzando per la connessione. Se ci si desidera collegare al PC locale 192.168.0.4, non è possibile farlo usando la rete del provider di internet, in quanto l'IP non viene mai utilizzato in internet e non può essere trovato. Quindi, si dovrebbe associare al socket il tuo IP nella stessa rete (192.168.0.1 ad esempio).
Fortunatamente, winsock sceglierà automaticamente l'IP che è possibile utilizzare però nulla vi impedisce di associare al socket l' indirizzo IP da soli.

Si noti che la funzione di associazione offre all'utente la possibilità di impostare l'indirizzo IP o numero di porta a zero. In questo caso, zero significa 'far scegliere a winsock qualcosa per me'. Questo è utile quando si vuole connettersi utilizzando un IP specifico sul lato client, ma non si preoccupano il numero di porta utilizzato.

ascolto
Le cose sono diverse sul lato server. Un server deve aspettare per le connessioni in entrata.i clients dovrano conoscere sia l'IP e il numero di porta del server per essere in grado di connettersi ad esso. Per facilitare le cose, i server quasi sempre utilizzare un numero di porta fisso (spesso il numero di porta di default del protocollo utilizzato).

L'attesa di connessioni in ingresso su un indirizzo specificato viene chiamato ascolto.I socket sono spesso associato a un indirizzo prima di metterlo in stato di ascolto. Quando il numero di porta di questo indirizzo è impostato su un numero fisso, il server sarà in ascolto per le connessioni in entrata su tale numero di porta specifico. Per esempio, la porta 80 (l'impostazione predefinita per HTTP) viene ascoltato dalla maggior parte dei server web. Il socket può essere associato ad un IP specifico come pure puo ascolto su tutti gli indirizzi disponibili permettendo il collegamento di tutte le reti. Può essere impostata su un IP fisso, ad esempio l'IP dell'interfaccia di rete locale, quindi i computer della rete locale sarano in grado di connettersi al server, ma non quelli collegati via Internet.

Quando un client richiede una connessione a un server in ascolto, il server lo accetta (o meno) e generare un altro socket che sarà il punto finale del collegamento. In questo modo il socket di ascolto non viene utilizzato per il trasferimento di dati sulla connessione e può continuare ascolto per altre connessioni in ingresso.

si ringrazia Lu@Hck88 per la partecipazione
init1.it
ogni 2 parole c'era un figlio di puttana in mezzo xDD

«C’è chi si gode la vita, c’è chi la soffre, invece noi la combattiamo».
Avatar utente
Rom3oCrash
Utente
Utente
 
Messaggi: 672
Iscritto il: 04/05/2011 - 18:47

Re: Networking by Rom3ocrash

Messaggioda joker__ » 10/02/2013 - 15:18

Gran tutorial, argomento importante (oltre che interessante).
Grazie Rom3oCrash!

PS: potresti farne un pdf, avendo un po' di tempo ;)
Avatar utente
joker__
Utente
Utente
 
Messaggi: 27
Iscritto il: 21/10/2012 - 23:12

Re: Networking by Rom3ocrash

Messaggioda Rom3oCrash » 10/02/2013 - 16:54

il tutorial non è finito solo che a causa di un impegno improvviso non ho avuto tempo per per continuare.
Appena finito vedrò di mettere tutto in un pdf
init1.it
ogni 2 parole c'era un figlio di puttana in mezzo xDD

«C’è chi si gode la vita, c’è chi la soffre, invece noi la combattiamo».
Avatar utente
Rom3oCrash
Utente
Utente
 
Messaggi: 672
Iscritto il: 04/05/2011 - 18:47

Re: Networking by Rom3ocrash

Messaggioda Rom3oCrash » 10/02/2013 - 22:56

In questo capitolo del tutorial, vi mostrerò le funzioni di base di winsock per operare con i socket. E 'importante ricordare che questo capitolo è solo un'introduzione alle funzioni di base, in modo da essere in grado di seguire i capitoli successivi. La funzionalità di base di ogni funzione è relativamente semplice

WSAStartup & WSACleanup

Codice: Seleziona tutto
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
int WSACleanup();

Prima di chiamare qualsiasi funzione winsock, è necessario inizializzare la libreria winsock. Questo viene fatto con WSAStartup. Ci vogliono due parametri:

wVersionRequested

indica la versione più alta di windows sockets che il chiamante può utilizzare .Il byte più significativo indica il numero di versione minore, il byte di ordine inferiore indica il numero di versione maggiore.

lpWSAData

Puntatore alla struttura di dati WSADATA che deve ricevere i dettagli della implementazione di Windows Sockets.

per questo tutorial userò winsock 2. Questo significa che è necessario impostare il byte basso della wVersionRequested a 2, il byte alto può essere zero (il numero di revisione non è importante). La struttura WSADATA indicata con il parametro lpWSAData serve a ricevere alcune informazioni sulla versione winsock installata.

La funzione restituisce zero se è riuscita, altrimenti è possibile chiamare WSAGetLastError per vedere cosa è andato storto. WSAGetLastError serve a recuperare il codice dell'ultimo errore che si è verificato.

E 'importante notare che in certi non si otterrà la versione che hai richiesto nel parametro wVersionRequested. Questo parametro specifica la versione più recente di winsock che l'applicazione * supporti *, non che 'necessita'. Winsock cercherà di dare la versione che hai richiesto, ma se ciò non fosse possibile, si utilizza una versione precedente.Questa versione sarà disponibile dopo la chiamata, nell'elemento wVersion della struttura WSADATA. Si dovrebbe controllare la versione dopo la chiamata per vedere se davvero si ha la versione di winsock che si desiderava . Vi è anche un elemento wHighVersion che dà la massima versione di winsock supportata dal sistema.
in poche parole :
wVersionRequested: La versione più recente di winsock supportata dall'applicazione.
wHighVersion in WSADATA: La versione più recente di winsock il sistema supporta.
wVersion in WSADATA: tutte le versioni suportatte dal sistema

Ogni chiamata a WSAStartup deve corrispondere con una chiamata WSACleanup, che pulisce la libreria winsock. Sebbene inutile, WSAStartup può essere chiamato più di una volta, purché WSACleanup è chiamato lo stesso numero di volte.

Un esempio di inizializzazione e pulizia di Winsock:

Codice: Seleziona tutto
const int iReqWinsockVer = 2;   // versione minima di winsock richiesta

WSADATA wsaData;

if (WSAStartup(MAKEWORD(iReqWinsockVer,0), &wsaData)==0)
{
    // Controllare se la versione principale è almeno iReqWinsockVer
    if (LOBYTE(wsaData.wVersion) >= iReqWinsockVer)
    {
        /* ------- qui vanno inserite le finzioni di winsock ------- */
    }
    else
    {
        // Versione richiesta non disponibile
    }

    // chiusura winsock
    if (WSACleanup()!=0)
    {
        // chiusura non riuscita
    }
}
else
{
    //  avvio non riuscita
}
init1.it
ogni 2 parole c'era un figlio di puttana in mezzo xDD

«C’è chi si gode la vita, c’è chi la soffre, invece noi la combattiamo».
Avatar utente
Rom3oCrash
Utente
Utente
 
Messaggi: 672
Iscritto il: 04/05/2011 - 18:47

Re: Networking by Rom3ocrash

Messaggioda Rom3oCrash » 16/02/2013 - 14:01

socket

SOCKET socket(int af, int type, int protocol);

L'handle è di tipo SOCKET ed è utilizzato da tutte le funzioni che operano sul socket. L'unico valore non valido handle di socket è INVALID_SOCKET (definito come ~ 0), tutti gli altri valori sono legali (questo include il valore zero!).[*Un handle è un puntatore opaco. Sai che punta a qualcosa (anche se il "numero"che hai in mano non è necessariamente una locazione di memoria, ma magari un indice in una tabella), e non puoi manipolare questo qualcosa modificandolo direttamente, ma solo tramite le apposite funzioni fornite dalla libreria che ti fornisce l'handle.*]

I suoi parametri sono:

af
La famiglia di indirizzi da utilizzare. Utilizzare AF_INET per utilizzare la famiglia di indirizzi di TCP e UDP.

tipo
il tipo di socket da creare. Utilizzare SOCK_STREAM per creare un socket di streaming (utilizzando il protocollo TCP), o SOCK_DGRAM per creare un socket diagramma (UDP). Per ulteriori informazioni sui tipi di socket.

protocollo
il protocollo da utilizzare, questo valore dipende alla famiglia di indirizzi. È possibile specificare IPPROTO_TCP per creare un socket TCP.

Il valore restituito è un handle per il nuovo socket, o INVALID_SOCKET se qualcosa è andato storto. La funzione di presa può essere usata in questo modo:

Codice: Seleziona tutto
SOCKET hSocket;

hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (hSocket==INVALID_SOCKET)
{
    // error handling code
}

Closesocket chiude un socket.Se non si verificano errori restituisce zero altrimenti SOCKET_ERROR. Ogni socket che è stato aperto deve essere chiuso con closesocket.

s
Handle per il socket da chiudere. Non e piu posibile utilizzare questo handle del socket dopo aver chiamato questa funzione.

L'uso di closesocket è piuttosto semplice:
closesocket(hSocket);

Tuttavia, in alcune situazioni reali più operazioni sono necessarie per chiudereun socket correttamente. Questo sarà discusso più avanti nel tutorial.

sockaddr e ordinamento dei byte

Poiché winsock stato fatto per essere compatibile con diversi protocolli tra cui quelli che potrebbero essere aggiunti successivamente deve essere usato un modo generale di indirizzamento.TCP/IP utilizza l'IP e la porta per specificare un indirizzo, ma altri protocolli potrebbe farlo in modo diverso. La prima versione di winsock ho risolto il problema con la struttura sockaddr:
struct sockaddr
Codice: Seleziona tutto
{
    u_short    sa_family;
    char       sa_data[14];
};


In questa struttura, il primo elemento (sa_family) specifica la famiglia di indirizzi. I dati memorizzati nell'elemento sa_data posono variare tra le diverse famiglie di indirizzi. Utilizzeremo la famiglia di indirizzi Internet (TCP / IP) in questo tutorial, winsock ha definito sockaddr_in che è la versione di TCP/IP della struttura sockaddr. Sono essenzialmente la stessa struttura, ma il secondo è ovviamente più facile da manipolare.

Codice: Seleziona tutto
struct sockaddr_in
{
    short   sin_family;
    u_short sin_port;
    struct  in_addr sin_addr;
    char    sin_zero[8];
};


Gli ultimi 8 byte della struttura non sono utilizzati, ma vengono riempiti (con sin_zero) per conferire alla struttura la dimensione giusta (la stessa dimensione di sockaddr).

Prima di procedere, è importante conoscere l'ordine dei byte di rete. Nel caso in cui non si conosce, ordine byte è l'ordine in cui sono memorizzati i valori che si estendono su più byte. Ad esempio, un valore a 32 bit integer come 0x12345678 si estende su quattro byte a 8 bit. Macchine Intel x86 utilizzare l'ordine 'little-endian', il che significa che il byte meno significativo viene memorizzato per primo. Quindi il valore 0x12345678 verrebbe archiviato come la sequenza di byte 0x78, 0x56, 0x34, 0x12. La maggior parte delle macchine che non utilizzano little-endian uso big-endian, che è esattamente l'opposto: il byte più significativo viene memorizzato per primo. Poiché i dati di protocollo possono essere trasferiti tra macchine con diverso ordine di byte, uno standard è necessaria per evitare che le macchine interpretino i dati nel modo sbagliato.

ordinamento dei byte
Dato che protocolli come TCP / IP devono lavorare tra diversi tipi di sistemi con diversi tipi di ordinamento byte, lo standard è che i valori sono memorizzati in formato big-endian, chiamato anche ordine di byte di rete. Per esempio, un numero di porta (che è un numero a 16 bit) come 12345 (0x3039) viene memorizzato con i byte più significativi prima (es. 0x30, poi 0x39).Un indirizzo IP a 32-bit viene memorizzato nello stesso modo, ciascuna parte del numero IP è memorizzato in un byte, e la prima parte è memorizzata nel primo byte. Ad esempio, 216.239.51.100 viene memorizzato come sequenza di byte '216, 239,51,100 ', in questo ordine.

A parte il valore sin_family di sockaddr e sockaddr_in, che non fa parte del protocollo, ma dice a winsock da famiglia di indirizzi da utilizzare, tutti i valori in entrambe le strutture devono essere in ordine di byte di rete. Winsock fornisce diverse funzioni per trattare con la conversione tra l'ordine dei byte del local host e l'ordine dei byte di rete:
Codice: Seleziona tutto
u_short htons(u_short hostshort);

u_long htonl(u_long hostlong);

u_short ntohs(u_short netshort);

u_long ntohl(u_long netlong);
init1.it
ogni 2 parole c'era un figlio di puttana in mezzo xDD

«C’è chi si gode la vita, c’è chi la soffre, invece noi la combattiamo».
Avatar utente
Rom3oCrash
Utente
Utente
 
Messaggi: 672
Iscritto il: 04/05/2011 - 18:47

Re: Networking by Rom3ocrash

Messaggioda l'insetto » 20/02/2013 - 17:31

Ottima guida :)
p.s.: non l'ho letta tutta ma appena posso lo farò
< Acta Non Verba >
< Impara a far fruttare i tuoi errori >
Avatar utente
l'insetto
Utente
Utente
 
Messaggi: 62
Iscritto il: 29/01/2013 - 21:40

Re: Networking by Rom3ocrash

Messaggioda Lu@Hck88 » 24/02/2013 - 02:37

Anche se in ritardo ecco un esempio di un server echo con socket Unix ..... enjoy :D

Codice: Seleziona tutto
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

using namespace std;

int main() {
     
   int sockfd, newsockfd;
   socklen_t clilen;
   char buffer[1000];
   
   int n;
   
   struct sockaddr_in serv_addr, cli_addr;
     
   // Creo la socket
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   
   // Controllo errori
   if (sockfd < 0)
      cout << "\nERROR opening socket";
     
   bzero((char *) &serv_addr, sizeof(serv_addr));
   
   // Imposto i parametri in modo da crearmi una socket TCP sul porto 9876
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = INADDR_ANY;
   serv_addr.sin_port = htons(9876);
   
   // Richiesta di binding
   if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
      cout << "\nERROR on binding";
     
   // In ascolto. Max connessioni 5
   listen(sockfd,5);
     
   clilen = sizeof(cli_addr);
     
   // Accetto nuove connessioni e passo l'identificativo della socket client
   newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen);
     
   if (newsockfd < 0)
      cout << "\nERROR on accept";
     
   bzero(buffer,256);
   
   while (buffer[0] != 'q') {
     
      n = 0;
     
      // Leggo cio' che mi e' stato spedito
      read(newsockfd, buffer, sizeof(buffer));
     
      while ( buffer[n] != '\n' )
   n++;
     
      // Reinvio cio' che mi e' stato spedito
      write(newsockfd, buffer, n+1);
     
   }
     
   // Chiudo le socket
   close(newsockfd);
   close(sockfd);
     
   return 0;
}
Tutto è relativo. Prendi un ultracentenario che rompe uno specchio: sarà ben lieto di sapere che ha ancora sette anni di disgrazie! (Albert Einstein)
Avatar utente
Lu@Hck88
Utente
Utente
 
Messaggi: 240
Iscritto il: 04/05/2008 - 15:44
Località: Napoli


Torna a Guide, Tutorial & Manuali

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron