190 likes | 313 Views
010990001 - Tietoliikennetekniikan jatko-opintokurssi 2. Unix Network Programming The Sockets Networking API Chapter 1 - Introduction. Yleistä. Kirjassa mainitut lähdekoodit löytyvät osoitteesta: www.unpbook.com/src.html Haetaan ja puretaan komennoilla:
E N D
010990001 - Tietoliikennetekniikan jatko-opintokurssi 2 Unix Network ProgrammingThe Sockets Networking API Chapter 1 - Introduction
Yleistä • Kirjassa mainitut lähdekoodit löytyvät osoitteesta: www.unpbook.com/src.html • Haetaan ja puretaan komennoilla: wget http://www.unpbook.com/unpv13e.tar.gz tar zxf unpv13e.tar.gz • Koodi löytyy nyt unpv13e -alihakemistosta cd unpv13e
Yleistä • unpv13e/README kertoo kääntämisohjeet: ./configure • Käännetään peruskirjasto cd lib && make && cd - cd libfree && make && cd –
socket & TCP/IP • socket-ohjelmointirajapinnat toimivat verkko-ohjelmoinnissa TCP/IP-mallin termein yhteyksinä sovelluskerrokselta kuljetuskerrokselle • kirjassa käsitellään sekä TCP:n ja UDP:n osaavien socketien käyttöä ja jopa IP-kerroksen jättämistä välistä
Socket API - historiaa • Lähtöisin 4.2BSD -järjestelmästä vuodelta 1983 (Berkeley System Distribution) • sen jälkeen yleistyneet muissakin kuin BSD-pohjaisissa • Linuxin sockets API ei pohjaudu BSD apiin, vaan se on kehitetty tyhjästä (liekö ongelmia kirjan esimerkeissä?)
UNIX-standardit, POSIX • Portable Operating System Interface on IEEE:n määrittelemä standardikokoelma • Useita versioita (IEEE Std 1003.1-1988, -1990, -1992, -1993, -1996) • Part 1: System API (C-kieli) (kirjassa POSIX.1), Part 2: Shell and utilities (kirjassa POSIX.2)Part 3: System administration • Tietoa eri POSIX-standardeista http://www.pasc.org/standing/sd11.html
UNIX-standardit, Open Group • X/Open julkaisi 1992 Single Unix Specification -määrityksen • X/Open perusti Open software foundationin (OSF) kanssa 1996 Open Group:in • Open Group määritteli vuonna 1997 Single Unix Specification version 2 -määrityksen
UNIX-standardit • Austin Common Standards Revision Group määritellyt 4000 sivua ohjelmistorajapintoja • Yhdistää IEEE:n POSIX - ja Open Groupin Technical standard -määritykset • Tuloksena ISO/IEC 9945:2002 aka IEEE Std 1003.1-2001 aka Single Unix Specification Version 3 • Kirjassa kutsutaan nimellä The POSIX Specification , kirjan pääpaino juuri tässä määrityksessä ja sen Sockets API:ssa • http://www.unix.org/version3/
Simple daytime client • Puolet asiakas/palvelin -mallin perusesimerkistä • lähdekoodi: intro/daytimetcpcli.c • kääntäminen: cd intro && make
Simple daytime client • Muodostaa TCP-yhteyden palvelimelle ja kysyy siltä kellonajan • kertaa perusfunktiot: • socket() muodostaa TCP socketin • inet_pton() tekee merkkijonosta osoiterakenteen • connect() yhdistää palvelimeen • read() lukee socketista
Virheentarkistus • Funktoiden palautusarvot kannattaa tarkistaa virheiden varalta • Kirjan koodin kirjastossa on luotu useille funktioille ns. päällysfunktiot, joissa on yhden funktion toiminnallisuus ja palautusarvon tutkinta • lähdekoodilistaukset ovat näin selvempiä ja näiden funktoiden käyttö omassa koodissa nopeampaa • Tällaisen funktion huomaa isosta alkukirjaimesta, esim. Socket() , Bind(), Listen()
Päällysfunktiot • esim. lib/wrapsock.c - Socket() /* include Socket */ int Socket(int family, int type, int protocol) { int n; if ( (n = socket(family, type, protocol)) < 0) err_sys("socket error"); return(n); } /* end Socket */
Simple daytime server • Vastapuoli mainitulle daytime client -ohjelmalle • Kuuntelee asiakasohjelmien yhteyspyyntöjä, hyväksyy yhteyden ja lähettää ajan • lähdekoodi: intro/daytimetcpsrv.c • Mainitut päällysfunktiot käytössä
Simple daytime server • socket() korvattu Socket() :lla • Bind() sitoo paikallisen osoitteen socketiin • IP-osoitteena INADDR_ANY • porttina 13 (daytime) • Listen() asettaa kuuntelemaan yhteyksiä • Accept() hyväksyy yhteyden ja luo yhteyssocketin, Write() lähettää merkkijonon (ajan) asiakkaalle
daytime-esimerkki • Esimerkki on IPv4-riippuvainen • IPv6-toimivuus muutamalla muutoksellaintro/daytimetcpcliv6.c • molempien kanssa yhteensopiva käsitellään myöhemmin kappaleessa 11 • daytime esimerkkinä läpi kirjan, ominaisuudet vaan muuttuvat ja täydentyvät • toisena esimerkkinä kaiuttava (echo)
Harjoitus 1.1 & 1.2 • Kappaleen 1.9 lopusta löytyy ohjeet verkkotopologiatiedon saamiseen • komentoja netstat -ni ; netstat -nr , ifconfig • lähdekoodin haku ja kääntäminen esitelty jo aikaisemmissa kalvoissa - aja daytimetcpcli eri IP osoitteilla muutaman kerran
Harjoitus 1.3 & 1.4 • Muokkaa daytimetcpcli.c:n socket-kutsun ensimmäinen argumentti (AF_INET) 9999:ksi. Etsi errno -arvo tulostetulle virheelle • Lisää asiakasohjelmaan while-looppiin laskuri, joka lisääntyy yhdellä kun read palauttaa > 0
Harjoitus 1.5 • Vaihda daytimetcpsrv.c:n portti 13:sta 9999:ksi, vaihda write-kutsu silmukaksi, joka kutsuu write():ä (ajan merkkijonon) tavu kerrallaan • Vaihda myös asiakasohjelmasta (versiosta, joka tulostaa laskurin) portti 9999:ksi • Mitä asiakasohjelman laskurina tulostetaan?