Netwerk programmering

Inhoud


Aanleiding .

Mogelijk dat er een opdracht komt waarin gevraagd word allerlei kastjes wel nu op IEEE geinterfaced zijn te vervangen door internet verbinding . Daartoe rees bij mij de vraag hoe test je dit en hoe werkt data overdracht het eigenlijk .

Inleiding .

Netwerk communicatie bestaat uit een waslijst protocollen , een goed simple verhaal is gegeven door Atmel .
Waar het mij om gaat is hoe kan ik data van a naar b sturen .
Voor deze is een oplossing bedacht op de Buckley universiteit ergens beginjaren 1950 genaamd sockets.
Het idee erachter is , dat je een stopkontakt hebt met als je daar een stekker insteekt dus een verbinding hebt.
Dat stopkontakt maak je met socket() welke jou een stopkontakt_nummer geeft .
Je wil met iemand praten dus moet je er een steker insteken , maar die stekker moet voorzien worden van een geven met wie je wil praten(IP_adres) en waarover(port_type) .
Om de steker in het stopkontakt te steken zeg je connect(socket,met_wie_je_wil_verbinden) en als het goed gaat heb je dan verbinding met de andere kant . Je kunt nu data zenden en/of ontvangen totdat jou of de andere kant de verbinding verbreekt (close(socket) of closesocket(socket)) .
Als je op deze manier verbinding maak ben je wat men noemt een "client" .

Net als bij de telefoon , wil de anderekant je niet hebben dan geeft connect() een bezet(toon) melding.

Als je met iemand kontakt wilt opnemen moet die wel in staat zijn dit te beantwoorden .
De anderekant van een verbinding wordt een "server" genoemd . (vandaar de kreet client/server techniek)
Integenstelling tot diegene die verbinding wil hebben , dit niet altijd doet , moet de server altijd luister of er iemand is die met hem/haar wil praten . (er zijn technieken die server kunnen starten (awake functie))

Ook hierbij maak je een kontaktdoos (socket) met een contra stekker die je met de gegeven van jouzelf doorgeven d.w.z wie je bent en waarover gepraat kan worden . Doormiddel van bind(socket,wie_ik_ben) is de verbinding klaar voor ontvangst .

Nu maar wachten of er iemand met jouw wil praten om dit te konstateren vraag je of er een client is m.b.v. client_id=accept(my_socket,wie_ben_jij) dit geeft een wie_ben_jij beschrijving met onderanderen wie jij bent en over welke port ik met jij kan praten , feitelijk interesseerd je die praat port helemaal niet .

Nu kun je praten d.m.v. send(client_id,buffer,lengte_buffer) of
luisteren m.b.v. recv(client_id,buffer,lengte_buffer)

Als je er zat van bent close() je de client (niet jouw socket want dan ben jij ook weg) .

Over het algemeen wordt de afspraak gehanteerd dat eerst de client zend waarop de server antwoord enz. (Dit wordt onderanderen gebruikt bij je browser(client) verbinding met je provider(server) )


Praktijk .

Zoals meestal lijkt de theorie nog wel tebegrijpen maar het uitvoeren van die theorie is ineens een heel ander verhaal .

Het eerste feest is om tevinden of de jouw gevonden voorbeelden wel kunnen draaien op jouw pc.
Zo zijn er dus allerlei platforms met allen een iets andere interpretatie van een kommando.
In unix/linux moet je iets hebben als sys/socket.h in ms/mingwing/cingwing/djcpp heb je iets als winsock.h in Borland is er iets als netinet/tcp.h

Voorlopig heb ik een beetje gestoeid met winsock gebruik als vertaler mingwing/gcc .
Het eerste waar ik tegenaanloop is dat je winsock met iets onduidelijk moet initeren .
Merkwaardig genoeg met een termologie uit WSA wat een event versie van winsock is voor MSWindows .
Maar goed klad dat over en je init werkt . Een tweede verschil met unix/linux is dat veel routine namen anders zijn . close -> closesocket , ioctl -> ioctlsocket , write -> send , read -> recv .
De constanten heten meestal wel het zelfde evenals de structuren , ga niet zitten bitneuken in de structuren want die zijn niet voor alle platforms op de zelfde wijze gemaakt .

De transmissie wordt gezien als een data stream . (unix/linix ziet volgens mij alles als streams)
Tevens wordt er de transmissie gesproken over blocked en een nonblocked methode .
Het enige wat ik er van begrijp is dat normaal een blocked methode wordt gebruik hetgeen inhoud dat je niet moet proberen telezen als er geen data is want de lees opdracht wacht tot er ooits iets komt (busy form of waiting)
Je komt daar ook niet weer uit . Om blocking tevoorkomen kun je opvragen hoeveel gegevens er nog in je verbinding aanwezig zijn (ioctlsocket()) als dit nul is moet je geen ontvangstopdracht (recv) geven .
Je moet wel een wait() functie maken want tussen twee pakketten kan er een zekere tijd staan . Dit is wat genoemd wordt een time_out periode .

Hoe een teverzenden bericht weet dat het beeindigd is , weet ik niet .
Er is een methode , verzend data en beeindig dit met een close() (zoals FTP dit doet in het data channel) .
Je kunt dit detecteren met select(socket,read,write,unbound,time_out) .
Het maakt gebruik van een structure genaam FD , volstrekt onbegrijkbelijk .
Het een serie macro's . Je zet een groep voor read_check , write_check en eventueel bond_check en een timeout .
(Overigens kan ik de timout binnen mingwing niet aan de loop krijgen )
Er is een wat vreemde uitleg over wat bedoeld is met deze check's .
write_check zegt dat de connect bestaat en beschreven kan worden .
read_check zegt dat de connect niet bestaat of gelezen kan worden .
Wat ik gedaan heb is een select() met read en write check , deze antwoord altijd .
Als write check false is is de verbinding weg , een read_check en write_check true betekend dat je kunt lezen zonder een blocking te krijgen . Hoogstens krijg je een EOF melding als de verbinding is gesloten .
Als er dus een write_check true en een read_check false is kom je tijdens lezen in een timeout cycles .
Ik lost dit op door een _sleep(100) (sampling 0.1 sec) van de channel (zie netlib.c).

Een close() geeft op recv() altijd als resultaat/aantal een 0 .
De andere methode is een protocol afspraak , bv beeindig ieder transport met een crlf en de laatste regel met crlf .
(Waarschijnlijk doet HTTP dit , ergens staat dan ook de lengte van de laatste te lezen regel)
(Ik weet het niet maar crlf in DOS is vaak cr , in UNIX het is vaak lf. zie dos2unix.)

De andere bedoeling van select() is een polling systeem te maken zonder gebruik te maken van fork() .

Ook hoe nonblocking en wat ms assynchroon noemt , werkt c.q. doet is mij tot opheden niet duidelijk .

Een andere kreet is een keep_alive functie , ik heb het vermoeden dat dit er toe dient dat de client steeds de zelfde socket gebruiken kan . Normaal na close() wordt de socket terug gegeven aan het systeem en wordt er een nieuwe gemaakt bij de eerst volgende connect() .

Toepassingen betreffende socket lees dan eens ,
www.andrew.cmu.edu/~kevinm/sockets.html
lowtek.com/sockets/select.html
AVR460 : Embedded Web Server (zie www.atmel.com)

Toepassingen hebben soms een vast port nummer b.v. HTML is port 80 .
Lees maar eens pronix.de/c/standard_c/c-programmierung_27.shtml (CGI)
Leuk en korrect is HTML & INTERNET door Jan Kampherbeek .
De rest van de definities kun je lezen op www.w3.org , meestal werkt het niet op jouw Internet_Browser (Netscape,Explorer,Konquikador).
(Een nieuwe methode is XML waarin men informatie(text) scheid van de opmaak. De opmaak wordt gedaan door style_sheets (CSS/XSL) , de kranten doen dit al jaren!)

SMTP is port 25 , POP3(eMail) is port 110 , FTP is port 21 , TELNET is port 23 .
Lees maar eens www.vbip/winsock/socket-send/socket-send-02.asp


Voorbeelden

Opm : vertalen met Mingwin moet je de bibliotheek wsock32 toevoegen !

/////////////////////////////////////////////////////////
// Voorbeeld 1: Simple Client (in C)
////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
// Voorbeeld 2: Simple Server (in C)
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
Voorbeeld 3 Netwerk Lib (in C)
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
Voorbeeld 4 Client met Netwerk Lib (in C)
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
Voorbeeld 5 Server met Netwerk Lib (in C)
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
Voorbeeld 4 Client met Netwerk Lib (in Fortran)
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
Voorbeeld 5 Server met Netwerk Lib (in Fortran)
/////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
Voorbeeld 6 Client met Netwerk Lib (in PEU (Porteble Euphoria))
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
Voorbeeld 7 Server met Netwerk Lib (in PEU (Porteble Euphoria))
//////////////////////////////////////////////////////////////////////////


Uitleiding .

Hopelijk verduidelijkt dit het gebruik van een internet verbinding iets .
Voor aanvullingen en opmerkingen kun je me eMailen .