Gniazda BSD implementacja w C#

Podobne dokumenty
Iteracyjny serwer TCP i aplikacja UDP

Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998

Gniazda BSD. komunikacja bezpołączeniowa

Programowanie przy użyciu gniazdek

Podstawowe typy serwerów

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Programowanie sieciowe

Programowanie Sieciowe 1

Programowanie aplikacji równoległych i rozproszonych. Wykład 4

Gniazda BSD. Procesy w środowisku sieciowym. Gniazda podstawowe funkcje dla serwera. Gniazda podstawowe funkcje dla klienta

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła

Komunikacja sieciowa - interfejs gniazd

Gniazda - Wstęp. Oprogramowanie systemów równoległych i rozproszonych. Sposób komunikacji. Domena adresowa. olas@icis.pcz.pl

Przykłady interfejsu TCP i UDP w Javie

Programowanie sieciowe

Projektowanie oprogramowania systemów KOMUNIKACJA SIECIOWA I SYSTEMY RPC

Gniazda surowe. Bartłomiej Świercz. Łódź,9maja2006. Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda surowe

Systemy rozproszone. Krzysztof Banaś Obliczenia równoległe 1

Ćwiczenie 2. Obsługa gniazd w C#. Budowa aplikacji typu klient-serwer z wykorzystaniem UDP.

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programowanie aplikacji w architekturze Klient-Serwer - UDP

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

2. Interfejs gniazd Gniazdo

Programowanie rozproszone w języku Java

ZESZYTY ETI ZESPOŁU SZKÓŁ W TARNOBRZEGU Nr 1 Seria: Teleinformatyka 2013

Komunikacja z użyciem gniazd aplikacje klient-serwer

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Networking. Zaawansowane technologie Javy 2019

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

Sockety TCP/IP - podstawy. Sieci Komputerowe II Wyk ład 2

Prosta aplikacja klient - serwer na bazie protokoªu UDP. Sprawozdanie.

Model OSI/ISO. Komputer B. Warstwy w modelu OSI aplikacji. aplikacji. prezentacji Komputer A. prezentacji. sesji. sesji. komunikacja wirtualna

Tryb bezpołączeniowy (datagramowy)

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Klient-Serwer Komunikacja przy pomocy gniazd

Gniazda. S. Samolej: Gniazda 1

Programowanie w języku Java

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

4 C#. Tworzenie aplikacji sieciowych. 101 gotowych projektów

Instytut Teleinformatyki

Serwer współbieżny połączeniowy

TCP - receive buffer (queue), send buffer (queue)

Programowanie Systemów Rozproszonych Laboratorium 1 Wprowadzenie do Visual Studio i C# Paweł Paduch

Programowanie współbieżne i rozproszone

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

Warstwa transportowa. Warstwa transportowa. Enkapsulacja. Zapewnienie niezawodnego przesyłania danych /wg ISO/ Transmisja bezpołączeniowa

Odbieranie wiadomości elektronicznych.

Aplikacja wielowątkowa prosty komunikator

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Tunelowanie, kapsułkowanie, XDR. 1. Transmisja tunelowa i kapsułkowanie serwery proxy. 2. Zewnętrzna reprezentacja danych XDR.

Java programowanie w sieci. java.net RMI

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Podstawowe typy serwerów

Architektura typu klient serwer: uproszczony klient POP3

Sieci komputerowe 1 DSRG

PROTOKOŁY WARSTWY TRANSPORTOWEJ

Programowanie gniazd w C# - część I

Instytut Teleinformatyki

Przykład. Podaj nazwę domenową hosta a odczytaj jego adres IP, lub odwrotnie:

Schemat dla UDP. = możliwe zablokowanie aplikacji KLIENT SERWER. s=socket(...) bind(s,...) recvfrom(s,...) sendto(s,...) recvfrom(s,...

Aplikacja wielow tkowa prosty komunikator

JAVA I SIECI. MATERIAŁY:

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Platformy Programistyczne Zagadnienia sieciowe i wątki

Sieci komputerowe. Zajęcia 3 c.d. Warstwa transportu, protokoły UDP, ICMP

Obiekty sieciowe - gniazda Komputery w sieci Internet komunikują się ze sobą poprzez:

Java a dost p do Internetu.

1. Model klient-serwer

socket(int domain, int type, int protocol)

Bezpieczeństwo systemów informatycznych

Krótkie wprowadzenie do korzystania z OpenSSL

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

Kurs programowania. Wykład 10. Wojciech Macyna. 05 maja 2016

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Zadanie 2: transakcyjny protokół SKJ (2015)

Programowanie sieciowe

Gniazda komunikacji sieciowej w środowisku Java

KOMUNIKACJA MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Aplikacja Sieciowa wątki po stronie klienta

Tym razem nie skorzystamy z mechanizmu. Podglądanie pulpitu

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

Microsoft Visual C++.NET Edycja polska: Wydawnictwo RM

K O M U N I K A C J A MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

URL. Budowa URL (ang. Uniform Resource Locator): working#downloading

iseries Programowanie z użyciem gniazd

Qt in Education. Sieć I drukowanie

Tworzenie aplikacji rozproszonej w Sun RPC

Programowanie Programowanie z użyciem gniazd

Komputery i Systemy Równoległe Jędrzej Ułasiewicz 1

Plik klasy. h deklaracje klas

Materiały do zajęć III

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Przejmowanie wiadomości Gadu-Gadu

Java programowanie sieciowe

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Operatory na rzecz typu TString

Metody Metody, parametry, zwracanie wartości

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Programowanie Programowanie z użyciem gniazd

Transkrypt:

BSD implementacja w C#

Implementacja w C#: Przestrzeń nazw: System.Net.Sockets Klasa: public class Socket : IDisposable

Implementacja w C#: Konstruktor: public Socket( AddressFamily addressfamily, SocketType sockettype, ProtocolType protocoltype ) Oryginał: #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);

Implementacja w C#: Parametry konstruktora: public enum AddressFamily przydatne wartości: InterNetwork - gniazdo dla IP4 InterNetworkV6 - gniazdo dla IP6

Implementacja w C#: Parametry konstruktora: public enum SocketType przydatne wartości: Stream - gniazdo strumieniowe Dgram - gniazdo datagramowe Raw - gniazdo surowe Seqpacket - gniazdo z numerowanymi pakietami

Implementacja w C#: Parametry konstruktora: public enum ProtocolType przydatne wartości: Tcp Udp IPv4 IPv6 Raw

Przykład tworzymy gniazdo dla klienta protokołu HTTP using System.Net.Sockets; Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Implementacja w C#: Metoda: public void Connect( string host, int port ) Oryginał: #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);

Wyjątki rzucane przez Connect(): ArgumentNullException pusty adres hosta ArgumentOutOfRangeException niepoprawny port SocketException błąd wewnętrzny klasy Socket ObjectDisposedException gniazdo już zamknięto NotSupportedException niepoprawna rodzina InvalidOperationException gniazdo nasłuchuje

Przykład łączymy się z serwerem HTTP s.connect( www.wi.zut.edu.pl, 80);

Implementacja w C#: Metoda: public int Send( byte[] buffer ) Oryginał: #include <sys/types.h> #include <sys/socket.h> ssize_t send(int s, const void *buf, size_t len, int flags);

Wyjątki rzucane przez Send(): ArgumentNullException pusty bufor SocketException błąd wewnętrzny klasy Socket ObjectDisposedException gniazdo już zamknięto

Przykład wysyłamy polecenie do serwera HTTP s.send( System.Text.Encoding.ASCII.GetBytes( GET / HTTP\r\n\r\n ) );

Implementacja w C#: Metoda: public int Receive( byte[] buffer ) Oryginał: #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int s, void *buf, size_t len, int flags);

Wynik funkcji Receive(): Wynik: Liczba faktycznie odczytanych bajtów danych lub (-1) w wypadku wystąpienia błędu

Wyjątki rzucane przez Receive(): ArgumentNullException pusty bufor SocketException błąd wewnętrzny klasy Socket ObjectDisposedException gniazdo już zamknięto SecurityException niedostateczne uprawnienia

Przykład odbieramy odpowiedź serwera HTTP byte[] buff = new byte[1024]; while(s.receive(buff) > 0) Console.Write( System.Text.Encoding.ASCII.GetString( buff));

Implementacja w C#: Własność: public int Available { get; } Liczba bajtów, jaką można bezpiecznie odczytać z gniazda

Implementacja w C#: Metoda: public void Close() Oryginał: #include <unistd.h> int close(int fd);

Przykład zamykamy połączenie z serwerem s.close();

Kompletny klient HTTP: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); s.connect("www.wi.zut.edu.pl", 80); s.send(system.text.encoding.ascii.getbytes( "GET / HTTP\r\n\r\n")); byte[] buff = new byte[1024]; while(s.receive(buff) > 0) Console.Write(System.Text.Encoding.ASCII.GetString(buff)); } } }

A teraz napiszemy serwer protokołu HTTP plan pracy: Socket SetSockOpt Bind Listen Accept

Implementacja w C#: Metoda: public void SetSocketOption( SocketOptionLevel optionlevel, SocketOptionName optionname, bool optionvalue ) Oryginał: #include <sys/types.h> #include <sys/socket.h> int setsockopt(int s,int level,int optname, void *optval,socklen_t optlen);

Implementacja w C#: Parametr metody: public enum SocketOptionLevel; Przydatne wartości: Socket IP IPv6 Tcp Udp

Implementacja w C#: Parametr metody: public enum SocketOptionName; Przydatne wartości: ReuseAddress konieczne dla serwera! DontRoute OutOfBandInline

Przykład włączamy opcję ReuseAddress na poziomie Socket s.setsocketoption( SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

Implementacja w C#: Metoda: public void Bind( EndPoint localep ) Oryginał: #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

Implementacja w C#: Parametr metody: using System.Net; public abstract class EndPoint public class IPEndPoint : EndPoint konstruktor klasy IPEndPoint: public IPEndPoint(IPAddress address, int port);

Implementacja w C#: W przypadku pisania kodu serwera szczególnie przydatny jest składnik klasy IPAddress: using System.Net; public static readonly IPAddress Any; Any reprezentuje wszystkie adresy IP znane systemowi serwera.

Wyjątki rzucane przez Bind(): ArgumentNullException pusty adres EP SocketException błąd wewnętrzny klasy Socket ObjectDisposedException gniazdo już zamknięto SecurityException niedostateczne uprawnienia

Przykład dowiązujemy się do portu 80 s.bind(new IPEndPoint(IPAddress.Any, 80));

Implementacja w C#: Metoda: public void Listen( int backlog ) Oryginał: #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog);

Wyjątki rzucane przez Listen(): SocketException błąd wewnętrzny klasy Socket ObjectDisposedException gniazdo już zamknięto

Przykład zaczynamy nasłuchiwać s.listen(5);

Implementacja w C#: Metoda: public Socket Accept() Oryginał: #include <sys/types.h> #include <sys/socket.h> int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

Wyjątki rzucane przez Accept(): SocketException błąd wewnętrzny klasy Socket ObjectDisposedException gniazdo już zamknięto InvalidOperationException gniazdo nie nasłuchuje

Przykład czekamy na klienta for(socket n = s.accept(); ; n.close()) { : : }

Kompletny serwer HTTP:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.setsocketoption(socketoptionlevel.socket, SocketOptionName.ReuseAddress, true); s.bind(new IPEndPoint(IPAddress.Any, 80)); s.listen(5); Socket n; string doc = "<html><body><h1>hello WORLD!</h1></body></html>\n\n"; for (; (n = s.accept())!= null; n.close()) { byte[] query = new byte[100]; while (n.available > 0) n.receive(query); n.send(system.text.encoding.ascii.getbytes( "HTTP/1.1 200 OK\r\n" + "Content-Length: " + Convert.ToString(doc.Length) + "\r\n" + "Content-Type: text/html\r\n\r\n" + doc )); } } } }