Aplikacja Sieciowa wątki po stronie klienta

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

IPC: Kolejki komunikatów

Klient-Serwer Komunikacja przy pomocy gniazd

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

SEGMENT TCP CZ. II. Suma kontrolna (ang. Checksum) liczona dla danych jak i nagłówka, weryfikowana po stronie odbiorczej

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Przykłady interfejsu TCP i UDP w Javie

Komunikatory typu TCP/IP lab2. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

5. Algorytm genetyczny przykład zastosowania

Platformy Programistyczne Zagadnienia sieciowe i wątki

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

5. Model komunikujących się procesów, komunikaty

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

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

TRX API opis funkcji interfejsu

Komunikator internetowy w C#

Wstęp do Programowania, laboratorium 02

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

1 Podstawy c++ w pigułce.

Twisted. Silnik Twojego Internetu. Jan Urbański Ducksboard. PyWaw #25, Warszawa, 10 czerwca 2013

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

Protokół wymiany sentencji, wersja 1

Zamawianie Taxi Aktywator Instrukcja użytkownika

Aplikacja wielowątkowa prosty komunikator

Złośliwe oprogramowanie Sandrorat (podszywające się pod oprogramowanie Kaspersky) na platformę Android WYNIKI ANALIZY

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PWI Instrukcja użytkownika

Instrukcja integratora - obsługa dużych plików w epuap2

Podstawy technologii WWW

Tworzenie aplikacji rozproszonej w Sun RPC

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

INSTRUKCJA OBSŁUGI USTAWIEŃ DYNAMICZNIE PRZEDZIELANYCH ADRESÓW IP W URZĄDZENIACH SYSTEMU IP-PRO ORAZ REJESTRATORACH MY-DVR

Zmienne i stałe w PHP

Mechanizmy pracy równoległej. Jarosław Kuchta

Akademia Techniczno-Humanistyczna w Bielsku-Białej

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Kolejki FIFO (łącza nazwane)

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

System obsługi ubezpieczeń FORT

Kolejkowanie wiadomości Standard MQ (JMS)

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

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

lekcja 8a Gry komputerowe MasterMind

Komunikacja między sterownikami przez protokół ADS

Konfiguracja konta pocztowego w Thunderbird

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Modele danych walidacja widoki zorientowane na model

1 Podstawy c++ w pigułce.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Winsock. Sieci Komputerowe II Wyk ład 3

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

SIP Studia Podyplomowe Ćwiczenie laboratoryjne Instrukcja

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Program dla praktyki lekarskiej

76.Struktura oprogramowania rozproszonego.

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Architektura typu klient serwer: uproszczony klient POP3

instrukcja użytkownika terminala ARGOX PA-20 SYSTEMY AUTOMATYCZNEJ IDENTYFIKACJI

wersja dokumentu 1.0 data wydania

Sieci komputerowe i bazy danych

Program do obsługi ubezpieczeń minifort

51. Metody komunikacji nieblokującej.

1. Aplikacja LOGO! App do LOGO! 8 i LOGO! 7

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej. Laboratorium przyrządów wirtualnych. Ćwiczenie 4

Podstawy programowania skrót z wykładów:

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Opis protokołu RPC. Grzegorz Maj nr indeksu:

MODUŁ INTEGRUJĄCY ELEKTRONICZNEGO NADAWCĘ Z WF-MAG SPIS TREŚCI

Podstawowe typy serwerów

Wymagania dla systemu HIS w zakresie komunikacji HL7. Serwer odbierający transakcje HL7. Klient wysyłający transakcje HL7

System Rozproszone Komunikator Dokumentacja. Maciej Muszkowski Jakub Narloch

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Dokumentacja SMS przez FTP

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

Poradnik korzystania z usługi FTP

Data modyfikacji:

Instrukcja obsługi. eurząd. Profil Interesanta

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Korzystanie z Certyfikatów CC Signet w programie MS Outlook 98

Wybrane działy Informatyki Stosowanej

ZPKSoft WDoradca. 1. Wstęp 2. Architektura 3. Instalacja 4. Konfiguracja 5. Jak to działa 6. Licencja

Dokumentacja techniczna

Skąd dostać adres? Metody uzyskiwania adresów IP. Statycznie RARP. Część sieciowa. Część hosta

Materiały dodatkowe Krótka charakterystyka protokołu MODBUS

Remote Quotation Protocol - opis

INSTRUKCJA KONFIGURACJI KLIENTA POCZTOWEGO

Instalacja (GM) AMXBans #1.5.1/ #1.6.1 na serwerze gry/stronie WWW. Wymagania

Technologie sieciowe Sprawozdanie z labolatorium. Lista 5

Instrukcja obsługi serwera FTP v

ADVANCE ELECTRONIC. Instrukcja obsługi aplikacji. Modbus konfigurator. Modbus konfigurator. wersja 1.1

Model OSI. mgr inż. Krzysztof Szałajko

Laboratorium - Przechwytywanie i badanie datagramów DNS w programie Wireshark

Aplikacje w środowisku Java

Umieszczanie kodu. kod skryptu

Transkrypt:

Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się połączyć z drugim klientem. Cała komunikacja, pomimo tego, że przebiegała bez problemów, miała jedną wadę: za każdym razem kiedy wysyłano komunikat do drugiego klienta należało poprzedzić go bajtem 1 natomiast chcąc odczytać komunikat należało wybrać 2. Problem ten wynikał z synchronizmu przesyłania i odbierania danych. W programie klienta występował tylko jeden wątek główny (main), który w tym samym czasie może obsługiwać tylko jedne typ operacji: zapis lub odczyt z serwera. W dzisiejszym programie rozwiążemy ten problem poprzez dodanie wątku roboczego, który przez cały czas będzie odczytywał dane z serwera. Najpierw jednak musimy zmodyfikować program serwera który będzie teraz wykonywał operacje wymiany danych bez zwracania uwagi na pierwszy bajt komunikatów pochodzących od klienta. W miejsce kodu zajmującego się transferem danych: Musimy dodać kod który zrealizuje operacje: Jeśli current_client==client1 to: Przypisz recvbuf do msg2client2 Przypisz msg2client2 do sendbuf wyślij dane do client2 Jeśli current_client==client2 to: Przypisz recvbuf do msg2client1 Przypisz msg2client1 do sendbuf wyślij dane do client1

Wykonanie tych operacji kończy zmiany w aplikacji serwera.należy skompilować i uruchomić serwer. Teraz musmimy zmodyfikować program klienta. Tutaj podobnie jak ma to miejsce w aplikacji serwera musimy dołączyć nowy wątek (wątek dołączony zostanie do procesu programu). W main dodajemy wątek oraz funkcję CreateThread: DWORD thread; // watek numer // Initialize Winsock. klient.initializewsa(); // Create a socket. klient.socketcreate(); // bind socket. //Prompt the user to enter anip cout<<"enter an IP address (127.0.0.1 is the loopback address)"<<endl; //Wait for the user to input an IP cin >> ipaddress; //connect to server klient.connecttoserver(ipaddress.c_str(), port); //Create thread CreateThread(NULL, 0,receive_cmds,0, 0, &thread);... Zaraz za staworzonym wątkiem rozpoczyna się pętla, która przez cały czas czeka na komunikat wpisany przez użytkownika. Dotychczas w pętli znajdowała się też część kodu obsługujacego odbieranie danych. Tym razem, kod ten wykonany zostanie we funkcji wątku oznaczonej nazwą: receive_cmds. Wunkcja ta musi być zdefiniowana w następujący sposób: DWORD WINAPI receive_cmds(lpvoid lpparam) { return 0; Ciało funkcji Ciało funkcji stanowi cześć kodu, odpowiadająca za odbiór danych:

w całości zamknięta w pętli nieskończonej. Program klienta jest zakończony. Należy teraz skompilować i uruchomić aplikację. Podczas testów dane powinny być asynchronicznie odbierane oraz wysyłane. Pierwszy problem naszego komunikatora jest już rozwiązany. Teraz pozostaje kwestia przesyłania danych w innej formie niż tablica znaków. Otóż bardzo często chcemy przesłać dane różnego typu określające np. aktualny stan gry. Najlepszym rozwiązaniem jest przesłanie struktury tzw. ramki. Najpierw musimy dodać strukturę do programu. Zaczynamy od serwera gdzie ramka danych już występuje i jest ona zdeklarowana w pliku nagłówkowym: W klasie CServerWSA można też znaleźć pola typu naszej struktury o nazwach: SFrame inbuff; SFrame outbuff; Teraz musimy użyć naszych ramek. W serwerze zaczynamy od powiększenia buforów wysyłającego i odbierającego. Wysyłać będziemy typ całkowity (4bajty) oraz 32 znaki (32 bajty) nasze bufory muszą mieć co najmniej 36 bajtów pojemności. Rozszerzamy je zatem np. do 40 znaków: Teraz przechodzimy do pliku CServerWSA.cpp gdzie zaczniemy od funkcji czyszczącej bufory. Musi ona czyścić całe 40 bajtów: for(int i = 1;i<40;i++){ sendbuf[i]=0; recvbuf[i]=0; Następnie zmieniamy metodę wysyłającą dane, zmieniając jej kod na:

void * wsk_void; wsk_void = &outbuff; char * wsk_char=(char *)wsk_void; int k=sizeof(outbuff); for (int i=0;i<sizeof(outbuff);i++) { sendbuf[i] = wsk_char[i]; int bytessent = send(client, sendbuf, sizeof(outbuff), 0 ); printf( "Bytes Sent: %ld\n", bytessent ); Można zauważyć, że przez referencję przekazujemy dane ze struktury do wskaźnika, który następnie jest rzutowany na typ char. Podobną operację musimy wykonać w metodzie odbierającej dane: Tutaj jednak celem jest przepisanie odebranych danych do postaci struktury. Podsumowując: za każdym razem dane są wysyłane z ramki SFrame outbuff, jednocześnie dane przychodzące od klientów formatowane są do postaci ramki SFrame inbuff. Na rysunku powyżej podkreślono funkcję odbierającą, która jak widać czeka na 36 bajtów. Jest to bardzo ważne, bowiem oczekiwanie na inną ilość danych spowoduje podzielenie paczek danych oraz późniejsze błędne formatowanie. Na koniec, w serwerze zmieniamy postać funkcji wykonywanej we wątku. Dla przykładu podano postać obsługi klienta nr. 2: if(client2==current_client){ for(int j=0; j<32; j++) { server.msg2client1[j]=server.inbuff.data[j]; server.outbuff.data[j]=server.msg2client1[j]; server.outbuff.flag=2; ///flaga mówiąca o nadawcy server.senddata(client1);

Analogicznie należy zmodyfikować obsługę klienta 1. Skończyliśmy zmieniać aplikację serwera, nadszedł czas na aplikację klienta. Tutaj modyfikację zaczynamy od dodania ramki danych (struktury) oraz dodania odpowiednich pól: inbuff oraz outbuff: Działając tak jak podczas aplikacji serwera zmieniamy metody: wysyłającą dane, odbierającą dane oraz czyszczącą bufory. Ostatecznie w wątku modyfikujemy wyświetlanie danych: for(int k=0; k<32; k++){ printf("%c", klient.inbuff.data[k]); printf(" flaga: %d", klient.inbuff.flag); oraz modyfikujemy wysyłanie danych w main, tak żeby wysyłane string wpisywany był bezpośrednio do struktury. Poprawnie działające aplikacje serwera i klienta, podczas asynchronicznej komunikacji wymieniają dane w postaci znaków oraz flagi:

Podsumujemy nasze aplikacje: 1. Serwer jak i klient działają w oparciu o wątek główny i roboczy 2. Serwer oraz klient przesyłają pomiędzy sobą struktury danych 3. Struktura danych (ramka) może składać się z różnej ilości danych, podczas wysłania danych wszystko traktowane jest jako znaki. Stan wiedzy po zajęciach: 1. Struktura jako pole klasy 2. Mechanizm przesyłania struktury 3. Wątek mechanizm, cel, realizacja. Sprawozdanie, 1. Nasz ramka ma składać się z tablicy znaków (32 znaki) oraz dwóch zmiennych typu całkowitego. Zmodyfikować kod tak aby możliwe było przesyłanie ramki. Załączyć kod, który uległ modyfikacji. 2. Nasz serwer obsługuje n (gdzie n=3) klientów. Zaproponuj mechanizm przesyłania danych, tak, aby możliwe było przesłanie danych pomiędzy dowolnymi klientami. Dokonaj zmian w kodzie klienta i serwera (wykonanych na zajęciach) tak by spełnić wymogi zadania. Uwaga: każdy klient wie od kogo otrzymał wiadomość, natomiast podczas wysyłania wiadomości wysyłana jest do konkretnego klienta. Załączyć kod, który uległ modyfikacji oraz dodać stosowny komentarz.