List

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 jednocześnie co stały okres czasu wysyła mu pewne informacje (np. o zmianie statusu innych użytkowników).

Poniższy kod pokazuje działanie najprostszego programu czytającego dane z deskryptora i wykonującego na nich operacje:

Problem, na który trafiamy to np.:

  • odbiór danych od wielu użytkowników (z wielu różnych socketów) w jednym procesie,
  • jednoczense oczekiwania na dane od strony użytkownika i niezależna od tego możliwość wysłania do użytkownika pewnych danych.

Do dyspozycji mamy jeden deskryptor, więc to co chcemy zrobić to oczekiwać na dane z niego pochodzące, ale z możliwością przerwania tego oczekiwania i wykonania innego zadania (np. zapisania do socketu komunikatu lub odczytania z innego socketu komunikatu).

W powyższym przykładzie funkcja read(sock1,c,20) zadziała w sposób blokujący – tj. do czasu aż nie otrzymamy danych w sock1, funkcja zablokuje działanie programu.

Rozwiązanie 1

Poniżej prezentujemy metodę na ustawienie deskryptora tak by nie był blokujący (tj. by operacja odczytu nie zatrzymywała działania aplikacji):

Rozwiązanie 2

Funkcja select czeka aż jeden z grupy deskryptorów readfds będzie gotowy do odczytu lub jeden z grupy deskryptorów writefds będzie gotowy do zapisu (lub jeden z grupy deskryptorów exceptfds) będzie miał wyjątki. Struktura tiemout zawiera maksymalny czas czekania.
W przypadku gdy którąś grupę deskryptorów ustawimy na NULL, select nie będzie na nie czekała.

Funkcja:

  • int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)  – funkcja pozwalająca na monitorowanie kilku deskryptorów (należących do zbioru o nazwie exceptfds) czekająca aż jeden z nich będzie gotowy do wykonania operacji I/O (tj. deskryptory readfds do operacji read, writefds do operacji write), w przypadku braku gotowości, funkcja kończy swoje działanie po upłynięciu czasu określonego w timeout),
  • int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask) – funkcja dla chętnych.

Makra FD:

  • void FD_CLR(int fd, fd_set *fdset) – usuwa deskryptor fd ze zbioru fdset,
  • int FD_ISSET(int fd, fd_set *fdset) – sprawdza czy deskryptor fd jest elementem zbioru fdset,
  • void FD_SET(int fd, fd_set *fdset– dodaje deskryptor fd do zbioru fdset,
  • void FD_ZERO(fd_set *fdset) – czyści zbiór fdset,

Zadania:

  • Napisz aplikację serwera i klienta, która bedzie działała jak “mini czat”. Serwer po uruchomieniu będzie nasłuchiwał na porcie 10000, a po połączeniu klienta pozwoli na komunikację użytkownikowi serwera i użytkownikowi klienta poprzez przesyłanie całych linii tekstu odczytanego z klawiatury.

  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 […]