Rozhraní Sockets Java a C (BSD)

Podobné dokumenty
Rozhraní Sockets Java a C (BSD)

Komunikace v sítích TCP/IP (2)

Síťové programování. Berkeley sockets Zdroje. Wikipedia Google Jan Kubr

Úvod Virtuální kanál TCP Datagramová služba UDP URL TCP, UDP, URL. Fakulta elektrotechnická

Programování v jazyku Java Java a Internet, základní pojmy, socketové x datagramové spojení, klient - server architektura.

Úvod Jednoduchá komunikace Sockety Konec. Programování v C# Síťová komunikace. Petr Vaněček 1 / 33

Komunikační sokety. teorie a implementace v C#, C++ a Javě. Aleš Keprt Katedra informatiky UP duben 2006, revize květen 2007

Sít ová komunikace v C++

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

1. Téma 12 - Textové soubory a výjimky

Úvod do po íta ových sítí KIV/UPS. Ing. Petr V elák 16. prosince 2008

Jak naprogramovat internetovou komunikaci?

Fakulta elektrotechniky a informatiky Vysoká škola báňská - Technická univerzita Ostrava. Cvičení 5 POČÍTAČOVÁ OBRANA A ÚTOK - POU

Soubor jako posloupnost bytů

Se vznikem internetu se můžeme na síťovou komunikaci v Javě (komunikace mezi více JVM) dívat dvěma pohledy-způsoby:

Protokoly: IP, ARP, RARP, ICMP, IGMP, OSPF

Regulární výrazy. Vzory

Počítačové sítě II. 14. Transportní vrstva: TCP a UDP. Miroslav Spousta, 2005

Transportní vrstva. RNDr. Ing. Vladimir Smotlacha, Ph.D.

RMI Remote Method Invocation

Identifikátor materiálu: ICT-3-03

Textové soubory. alg9 1

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Část 1 Příklad GUI aplikace Simulátor/Plátno. GUI s plátnem Struktura aplikace Struktura simulátoru Struktura grafického rozhraní Praktické ukázky

Počítačové sítě Systém pro přenos souborů protokol FTP

Počítačové sítě Transportní vrstva. Transportní vrstva

Téma 11. ICMP, IPv6 Transportní vrstva

Téma 10 SíťovéIP protokoly a API

Téma 10 SíťovéIP protokoly a API

6. Transportní vrstva

Distribuované systémy a výpočty

Algoritmizace a programování

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

TFTP Trivial File Transfer Protocol

Programování v Javě I. Leden 2008

PLATFORMÁCH FAKULTA INFORMAČNÍCH TECHNOLOGIÍ MARTIN VACH BRNO UNIVERSITY OF TECHNOLOGY

C++ a vnější svět. David Bednárek Jakub Yaghob Filip Zavoral

Abstraktní datové typy: zásobník

Programování v Javě I. Únor 2009

Analýza aplikačních protokolů

Síťování (informativní)

Počítačové sítě - program cvičení

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

8. přednáška: Soubory a proudy

Analýza protokolů rodiny TCP/IP, NAT

InputStream. FilterInputStream

Java Výjimky Java, zimní semestr

7. Aplikační vrstva. Aplikační vrstva. Počítačové sítě I. 1 (5) KST/IPS1. Studijní cíl. Představíme si funkci aplikační vrstvy a jednotlivé protokoly.

Operační systémy a databáze. Téma 13. Počítačové sítě

Síťování (informativní)

Síťování (informativní) Síťování (informativní) Zdroje. Co je síťování? Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Vlastnosti podporované transportním protokolem TCP:

Y36PSI Protokolová rodina TCP/IP

UPS MONITOR Zařízení pro monitorování záložních zdrojů s protokolem Smart UPS APC

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Datové struktury. alg12 1

Vytváření a použití knihoven tříd

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Ošetřování chyb v programech

Úvod do programování - Java. Cvičení č.4

Implementace aplikační vrstvy pro jednočipové mikrokontroléry

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Řídicí modul pro systém na monitorování polohy mobilních objektů

X36PKO Úvod Protokolová rodina TCP/IP

Počítačové sítě - program cvičení

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Hypertext Transfer Protocol (HTTP/1.1 RFC 2616) Počítačové sítě Pavel Šinták

Přednáška 3. Opakovače,směrovače, mosty a síťové brány

Uživatelský manuál. SERInet ST

Y36PSI IPv6. Jan Kubr - 7_IPv6 Jan Kubr 1/29

Technologie počítačových sítí 8. přednáška

Práce se soubory v Javě

Uživatelský manuál. SERInet ST

Základy IOS, Přepínače: Spanning Tree

Teoretické minimum z PJV

6. PRÁCE S DATOVÝMI PROUDY

Model ISO - OSI. 5 až 7 - uživatelská část, 1 až 3 - síťová část

1 Úvod do sítí TCP a UDP Porty... 1

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Diplomová práce. Analýza síťového provozu

Vláknové programování část V

Rodina protokolů TCP/IP. Rodina protokolů TCP/IP. verze 3. Téma 9: Transportní protokoly. Jiří Peterka

DLNA- Průvodce instalací

JAVA. Ještě k funkcionálnímu programování (pokračování z předchozí přednášky)

Zadání Vytvoříme jednoduchý multithread HTTP server v jazyce Java Spustíme si ho na lokálním počítači A otestujeme ho Zdrojový kód je v

7. Datové typy v Javě

KTE / ZPE Informační technologie

Úvod do programovacích jazyků (Java)

Typický prvek kolekce pro české řazení

Počítačové sítě - program cvičení

PREPROCESOR POKRAČOVÁNÍ

ETH2CAN CAN firmware

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Výjimky. v C# a Javě

Komunikační protokol snímače rel. vlhkosti SV-xxx-x

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Transkript:

Rozhraní Sockets Java a C (BSD) Počítačové sítě 3. cvičení

Semestrální projekt (1)

Semestrální projekt (2) Struktura projektu: Adresní plán a konfigurace VLAN Směrování a NAT DNS server DHCP server Zabezpečení sítě ACL Podmínky, co musí obsahovat jednotlivé části přesně zadány

Úvodní informace BSD Sockety práce se síťovým spojením jako se soubory (POSIX) Protokoly rodiny IP TCP a UDP, identifikace IP adresou a číslem portu TCP (Transmission Control Protocol) - spolehlivý logický kanál. Před samotnou komunikací se naváže spojení, veškerá odeslaná data jsou druhou stranou potvrzována, na konci je nutno spojení ukončit (uzavřít). UDP (User Datagram Protocol) - Nedochází k navázání spojení, data jsou odeslána na stanovenou IP adresu a daný UDP port a nevíme, zda data dorazila, zda nešlo k jejich zdvojenému doručení (není-li vyplněn kontrolní součet, nevíme zda v pořádku).

Schéma práce se sockety TCP socket bind listen connect klient server accept DATA close Data: send/recv, read/write

Schéma práce se sockety UDP socket socket bind bind connect DATA close close Data: sendto/recvfrom Data: send/recv, read/write

Potřebné knihovny V Javě jsou potřebné třídy v Java.net Sockety java.io Vyjímky, streamy V C/C++ se připojují tyto hlavičky: netdb.h arpa/inet.h sys/time.h sys/socket.h netinet/in.h

Vytvoření socketu K vytvoření socketu v Javě slouží new Socket([adresa, c_port]) new ServerSocket(z_port [, bl]) new DatagramSocket([z_port]) UDP new MulticastSocket([z_port]) UDP multicasty K vytvoření socketu v C/C++ slouží funkce int socket(int domain, int type, int protocol) domain určuje způsob komunikace (PF_INET: IP) type je typ socketu SOCK_STREAM: TCP SOCK_DGRAM: UDP protocol není v našem případě třeba využit a je tudíž 0.

Pojmenování socketu V Javě je třeba specifikovat konkrétní port public void bind(socketaddress bindpoint) V C/C++ pojmenuje socket funkce int bind(int sck, struct sockaddr* name, int namelen) sck deskriptor socketu (z funkce socket) name struktura sockaddr_in s IP adresou socketu a číslem portu sin_family AF_INET protokol IPv4 sin_addr.s_addr IP adresa (INADDR_ANY) sin_port port na počítači Porty do 1024 jsou rezervováno pro roota! namelen velikost struktury sizeof(sockaddr_in))

Připojení klienta V Javě lze zadat adresu v konstruktoru (TCP), nebo void connect(socketaddress endpoint) Pro UDP lze použít třídy DatagramPacket a metod send a receive třídy DatagramSocket V C/C++ se připojíme k serveru funkcí int connect(int sck, struct sockaddr* name, int namelen) name jako u bind(), ale jde o cílovou adresu. V případě UDP není connect nutný, jsou-li používány funkce sendto a recvfrom

Provoz serveru V Javě existují metody bind (odpovídá bind+listen) a accept ve třídě ServerSocket Uvedeme č. portu a max počet požadavků, čekajících ve frontě (backlog) v konstruktoru nebo void bind(socketaddress endpoint, int backlog) Metoda void accept() - otevření příchozího socketu V C/C++ slouží k naslouchání na socketu funkce int listen(int sck, int backlog) backlog max počet požadavků, čekajících ve frontě int accept (int sck, struct sockaddr* addr, int* addrlen) Zablokuje se do přijetí požadavku, do addr je uložena IP adresa klienta (často po accept následuje int fork())

Zasílání dat V Javě využíváme reader/writer vytvořený nad streamy z getinputstream(), getoutputstream() nebo třídy DatagramPacket. C/C++ nabízí několik způsobů zasílání dat POSIXové souborové funkce read/write int read(int sck, char* buf, unsigned buflen) int write(int sck, char* buf, unsigned buflen) Fukce send/recv int send(int sck, char* buf,int buflen, int flags) int recv(int sck, char* buf,int buflen, int flags) flags mohou dále specifikovat data (urgentní, ) Funkce sendto/recvfrom pro datagramy bez connect int sendto(<jako send>, struct sockaddr* to, int tolen) int recvfrom(<jako recv>, struct sockaddr* from, int *fromlen)

Ukončení spojení V Javě lze slouží k ukončení spojení metoda void close() Na Socketu resp. na Input/Output streamu V C/C++ slouží k ukončení spojení funkce int close(int sck) klasické uzavření spojení int shutdown(int sck, int how) how = 0 uzavřít pro příjem how = 1 uzavřít pro vysílání how = 2 reset spojení

Nastavení parametrů socketu Nastavování v Javě pomocí metod get/set tříd *Socket (např. setsotimeout) Nastavování v C/C++ Funkce pro sockety int getsockopt(int sck, int lvl, int optname, char* optval, int* optlen) int setsockopt(int sck, int lvl, int optname, char* optval, int optlen) lvl: SOL_SOCKET, IPPROTO_TCP, Funkce pro práci se soubory (fcntl.h, unistd.h) int fcntl(int sck, int cmd, long arg) Funkce pro práci s V/V zařízeními (sys/ioctl.h) int ioctl(int d, int request,...)

Poznámky k Javě Non-blocking sockety nelze přímo použít, ale na Socketu lze volat metodu setsotimeout(milisekund) Pokud blokující operace (čtení, zápis) neskončí včas výjimka java.net.sockettimeoutexception Socket není zneplatněn, může následovat nový pokus o provedení operace po ošetření výjimky Převod doménového jména na InetAddress InetAddress ia=inetaddress.getbyname(jméno) ia.gethostaddress() vrací IP adresu jako řetězec

Non-blocking sockety v C/C++ Nemůžeme-li v programu čekat na příchod dat: int flag=0; flag=fcntl(sck, F_GETFL, 0); if(flag == -1) { flag = 0; } fcntl(sck, F_SETFL, flag O_NONBLOCK); Staré systémy nemající O_NONBLOCK: int flag=1; ioctl(sck, FIOBIO, &flag); Blokující funkce pak vracejí místo zablokování -1 errno nastaveno na EWOULDBLOCK

Řešení timeoutu v C #include <unistd.h> #include <signal.h> #define MAX_REP 10 //Max. počet retransmisí int repeat=0; //Aktuální počet retransmisí void alarmed(int signo) { if (++repeat > MAX_REP) { //Překročeno MAX_REP //Informovat, že vysílání selhalo signal(sigalrm, NULL); exit(-1); //Ukončit } else { //Provést retransmise alarm(1); //Znovu nastavit timeout } } //Odeslat data (1. pokus) alarm(1); signal(sigalrm,alarmed); //Nastavit timeout // Příjem potvrzení (pokud nepřijde během 1s, bude vyvolán SIGALRM) repeat=0; alarm(0); //Zrušit timeout

Pomocné funkce v C Převody mezi formáty reprezentací htonl, htons převádí endian z PC síť (long, short) ntohl, ntohs převádí endian z síť PC (long, short) unsigned long inet_addr(char* cp) převod z tečkové notace char* inet_ntoa(struct in_addr in) převod do tečkové notace Práce s doménovými jmény int gethostname(char* name, int namelen) název lokální stanice struct hostent* gethostbyname(char* name) adresa stanice je v char * he->h_addr struct hostent* gethostbyaddr(char* addr, int len, int type) doménové jméno z IP adresy char* he->h_name

Ukázka příkladů Detailní popis a příklady (na konci textu) C/C++ http://www.cs.vsb.cz/grygarek/ps/sockets.html Java http://www.cs.vsb.cz/grygarek/ps/dosys/inprise/ne t/examples Ex1 TCP Ex2 UDP Ex3 multicasty Ex4 získání dat pomocí URL(třída URLConnection)

Java připojení přes TCP Socket try { s=new Socket(host,port); BufferedReader sis = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter os = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())); BufferedReader is = new BufferedReader( new InputStreamReader(s.getInputStream())); String l; do { System.out.println("Type a line to send to server."); l=sis.readline(); os.write(l); os.newline(); os.flush(); System.out.println("Server: " + is.readline()); } while (!l.equals("exit") &&!l.equals("down")); s.close(); } catch (IOException e) { System.out.println(e); }

Java TCP Server try { ServerSocket s=new ServerSocket(port); Socket cs; do { cs=s.accept(); BufferedReader is = new BufferedReader (new InputStreamReader(cs.getInputStream())); BufferedWriter os = new BufferedWriter (new OutputStreamWriter(cs.getOutputStream())); do { msg=is.readline(); os.write(string.valueof(msg.length())); os.newline(); os.flush(); } while (!msg.equals("exit") &&!msg.equals("down")); cs.close(); } while (!msg.equals("down")); s.close(); } catch (IOException e) { System.out.println(e); }

Java MultiThreading TCP Server Vylepšuje předchozí příklad pomocí vláken, můžeme zpracovat více požadavků zároveň public class MyApplication implements Runnable { protected Socket cs; static ServerSocket s; static int port=8000; public static void main(string[] args) { Socket cs; try { s=new ServerSocket(port); do {cs=s.accept(); new Thread(new MyApplication(cs)).start(); } while (true); } catch (IOException e) {if(!e instanceof SocketException){System.out.println(e);}} } public MyApplication(Socket cs) {this.cs=cs;} public void run() { /* Zde patří fialový text z předchozího slide */ if (msg.equals("down")) s.close(); // Uzavře server socket a ukončí aplikaci } }

Java UDP Client String data; //Data získáme později, např. čtením ze System.in int port=8000; String server="www.cs.vsb.cz"; try { DatagramSocket s=new DatagramSocket(); DatagramPacket p = new DatagramPacket(data.getBytes(), data.length(), InetAddress.getByName(server), port); s.send(p); s.receive(p); reply=new String(p.getData(),0,p.getLength()); System.out.println("Reply arrived from "+ p.getaddress() +" : "+ p.getport()+ " > " + reply); s.close(); } catch (IOException e) { System.out.println(e); }

Java UDP Server Pro datagramové servery není samostatná třída, není ji potřeba try { DatagramSocket s=new DatagramSocket(port); DatagramPacket p; String msg; do { p=new DatagramPacket(new byte[512], 512); // ^ vzhledem k fixní velikosti bufferu pokaždé alokujeme znovu s.receive(p); msg = new String(p.getData(),0,p.getLength()); System.out.println("Datagram from " + p.getaddress() + " : " + p.getport() + " > " + m p.setdata(msg.touppercase().getbytes()); p.setlength(msg.length()); s.send(p); } while (!msg.equals("down")); s.close(); } catch (IOException e) { System.out.println(e); }

Úloha hromadný chat Poslání zprávy na talk server přes TCP/8000 Příjem zpráv z UDP/8010 broadcastu Zpráva max. 255 ASCII znaků ukončeno <LF> (tj. \n) Při posílání UDP zpět je zprávě předřazeno 5 bytů : 4 byte - IP adresa odesílatele (int, formát lo-hi) 4 byte - htonl(time_t) 1 byte - délka následujícího řetězce (0-255). 127 0 0 1 0x4A 0xAE 0x1A 0x30 3 SSS