List

Opis problemu

Komunikacja sieciowa jest bardzo elastycznym elementem komunikacji, jednakże niesie za sobą narzut obliczeniowy w postaci obsługi stosu TCP/IP po stronie klienta i serwera.

W przypadku gdy aplikacja klienta i serwera działają w tym samym systemie operacyjnym (na tym samym komputerze lub maszynie wirtualnej), wówczas narzut ten powoduje niepotrzebne wykorzystanie portów oraz obliczeń wykonywanych po stronie jądra.

 

Sockety unix – wprowadzenie i definicje

Struktura opisująca gniazdo unix wygląda następująco:

Przypisanie wartości strukturze sockaddr_un:

Funckje wykorzystane w celu utworzenia serwera:

  • unsingned int socket(int domain, int type, int protocol); – funkcja tworząca gniazdo. W przypadku gdy chcemy utworzyć gniazdo typu UNIX, należy podać jako domain AF_UNIX, type SOCK_STREAM, a protocol wartość 0.
  • int bind(int sockfd, const struct sockaddr *addrsocklen_t addrlen); – po utworzeniu struktury sockfd jest ona zadeklarowana w pamięci, ale podobnie jak dla protokołu IP nie miała jeszcze żadnego adresu przypisanego, tak dla gniazd UNIX następuje powiązanie z adresem pliku (a konkretniej strukturą opisującą adres gniazda).
  • int listen(int sockfd, int backlog); – funkcja oznaczająca gniazdo sockfd  jako gniazdo, które będzie wykorzystywane do otrzymywania nadchodzących połączeń. W przypadku gdy system otrzyma więcej niż jedno połączenie naraz, zostanie utworzona kolejka FIFO o maksymalnym rozmiarze backlog. Funkcję można wywołać tylko dla gniazd połączeniowych (SOCK_STREAM).
  • int accept(int sockfd, struct sockaddr *newsockfdsocklen_t *address_len); – wywołanie systemowe (czyli funkcja po stronie jądra) uruchamiane na utworzonym wczesniej gnieździe sockfd (będącym w trybie listen), w celu otrzymania połączenia. W przypadku gdy w danym momencie jest więcej niż jedno połączenie, system operacyjny zapewnia kolejkę oczekujących połączeń (FIFO). W takim przypadku jest brane pierwsze z kolejki. Tworzony i zwracany (jako int) jest nowy deskryptor newsockfd. Oryginalne gniazdo nie zmienia stanu.  Wywołanie accept wykorzystywane jest tylko do połączeniowych protokołów (SOCK_STREAM).

Funkcje wykorzystywane w celu utworzenia klienta:

  • funkcja socket – działa tak samo jak dla aplikacji serwera.
  • int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); – wywołanie connect nawiązuje połączenie do adresu opisanego przez strukturę addr  i łączy utworzonego połączenie do deskryptora sockfd. 

Funkcje czytania i pisania nie zmieniają się w porównaniu do normalnych gniazd protokołu IP.

Przykłady

Przykładowa aplikacja serwera:

Przykładowa aplikacji klienta:

 

Zadanie:

W oparciu o kod z tych i poprzednich zajęć zaimplementować następujące przypadki:

  • Przesyłanie bloków 1000-bajtowych za pomocą protokołu gniazd TCP z pomiarem czasu. Program powinien działać wg schematu pomiar czasu, socket, 1000 razysendto i recvfrom, close, pomiar czasu, podanie czasu podzielonego przez 100.
  • Przesyłanie bloków 1000-bajtowych za pomocą protokołu gniazd UNIX z pomiarem czasu. Program powinien działać wg schematu pomiar czasu,socket, connect, 1000 razy send i recv, close, pomiar czasu, podanie czasu podzielonego przez 100.

Wyniki proszę pokazać prowadzącemu.

 

Uwaga:

Przykłady aplikacji klienta i serwera to modyfikacje programów ze strony http://beej.us/guide/bgipc/output/html/multipage/unixsock.html

  Posts

May 20th, 2017

Different kernel types

https://en.wikipedia.org/wiki/Kernel_%28operating_system%29#Kernel-wide_design_approaches https://en.wikipedia.org/wiki/Unikernel https://en.wikipedia.org/wiki/Exokernel https://en.wikipedia.org/wiki/Nemesis_%28operating_system%29 http://windowsitpro.com/windows-server/top-ten-what-you-need-know-about-microsoft-nano-server

April 21st, 2017

Microsoft Roadmap for AzureStack

Microsoft’s Hyper-V looked really promising and it happened to be really good general purpose virtualization. Not it’s time for on-premise/hybrid […]

April 21st, 2017

Books reading :)

Mind development requires regular reading 🙂 Here are some advices: http://www.gq.com/story/how-to-read-a-whole-damn-book-every-week?mbid=synd_digg For me reading in the morning would be the best […]

October 25th, 2016

Linux – powłoka bash – skrypty 2

Wykorzystanie cydzysłowie: ‘   oraz   ‘ – apostfory służą do łączenia zawartych w nim znaków jako jeden ciąg znaków. Jest to […]

June 9th, 2016

Session data in Redis (with PHP exapmle)

Session data in Redis What is session Session is What is cookie Cookie is something you eat 🙂   How […]

June 7th, 2016

DSIK, DASL – Brama domyślna

Linux jako ruter Naszym celem będzie skonfigurowanie systemu linux jako urządzenia przesyłającego pakiety. W tym celu będziemy potrzebowali: uruchomić infrastrukturę (w […]

May 25th, 2016

How to change a hostname

Just a few easy steps: Manually update: /etc/hostname /etc/hosts it may be important to update some other files – see https://wiki.debian.org/HowTo/ChangeHostname […]

May 10th, 2016

Gartner Hype Cycle through last 10 years :)

I recently read about self driven cars and jumped into Gartner Hype Cycle term.   Brief introduction to the subject: […]

May 6th, 2016

Bug bounty program

I’ve recently heard about the Bug bounty idea – a program for rewarding IT geeks (with just recognition or even […]

April 26th, 2016

Is IBM’s Power8 powerful enough? :)

Recently I heard about Power8 platform designed “for Magento”.  Obviuosly, somebody from marketing had a great idea to ad the general platform […]

April 26th, 2016

DSIK – Zajęcia 8 – Raw Sockets

Surowe gniazda Na wcześniejszych zajęciach poznaliśmy metodę wykorzystywania funkcji systemowych do tworzenia nagłówków IP oraz warstwy TCP i UDP. Dzięki wykorzystanym funkcjom system automatycznie […]

April 25th, 2016

2016.04.25 – Etap 4

MedicaLibaro Paweł Banach, Rafał Pingot, Piotr Beczyński. Moodies Rafał Maszkowski, Mateusz Kulesza, Dawid Krawczyk.

April 24th, 2016

DSIK – Zajęcia 8 – Projekt – podział na grupy, wybór tematów

Wybrane grupy projektowe i przypisane tematy. Lista: Rutka, Sosnowski – serwer HTTP Nojnam, Ciuk – klient IRC Soprych, Macutkiewicz – […]

April 18th, 2016

DSIK – Zajęcia 0 – Plan zajęć.

Plan przedmiotu Zajęcia 1-8: Część zgodna z dotychczasowym harmonogramem. Wprowadzenie teoretyczne do warstwy 2 i 3. Diagnostyka sieci – polecenia. Gniazda […]

April 18th, 2016

DSIK – Zajęcia 7 – Projekt określenie wymagań

Zasady zaliczenia: projekt tworzy grupa 2 osobowa projekt obejmuje: napisanie programu: zaimplementowanie znanego protokołu (może być REST API, może być protokół […]

April 11th, 2016

DSIK – Zajęcia 5 – UDP, aplikacje socket bezpołączeniowe

Komunikacja bezpołączeniowa UDP (z ang. User Datagram Protocol – protokół  datagramów użytkownika) to bardzo lekki protokół umożliwiający przesyłanie komunikatów między klientem […]

April 7th, 2016

DSIK – Zajęcia 2 – Stos TCP/IP – Warstwa 3, polecenia diagnostyczne.

April 7th, 2016

DSIK – Zajęcia 6 – Sockety Unix.

Opis problemu Komunikacja sieciowa jest bardzo elastycznym elementem komunikacji, jednakże niesie za sobą narzut obliczeniowy w postaci obsługi stosu TCP/IP po […]

April 4th, 2016

DSIK – Zajęcia 4 – Nieblokujące programowanie gniazd.

Opis problemu Załóżmy, że napisaliśmy program działający jako serwer pewengo protokołu (np. xmpp), który oczekuje na komunikaty od użytkownika, ale […]

April 4th, 2016

DSIK – Zajęcia 4 – Aplikacje wielowątkowe

Aplikacje przetwarzające wiele wątków Rozważmy sytuację, gdy aplikacja serwera jest dostępna do publicznego użytku i potrzebuje np. 30 sekund ciągłych obliczeń […]

March 14th, 2016

DSIK – Zajęcia 3 – Sieci komputerowe – programowanie gniazd, wstęp (TCP klient i serwer).

Programowanie gniazd. Funkcje: ssize_t send(int sockfd, const void *buf, size_t len, int flags); – możliwość wykorzystnia tylko gdy socket jest […]

March 14th, 2016

DSIK – Zajęcia 1 – Stos TCP/IP – Warstwa 2, polecenia diagnostyczne.

Stos TCP/IP TCP/IP to rodzina protokołów stanowiących podstawę do komunikacji między komputerami w sieciach komputerowych. Do rodziny tej zaliczmy protokoły zapewniające adresowanie i […]