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

Podobne dokumenty
Aplikacja Sieciowa wątki po stronie klienta

Winsock. Sieci Komputerowe II Wyk ład 3

Programowanie Sieciowe 1

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

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Klient-Serwer Komunikacja przy pomocy gniazd

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Architektura typu klient serwer: uproszczony klient POP3

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Programowanie przy użyciu gniazdek

Wstęp do Programowania, laboratorium 02

I - Microsoft Visual Studio C++

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Komunikacja przez sieć z wykorzystaniem biblioteki WINSOCK. dr inż. Piotr Kaczmarek Instytut Automatyki i Inżynierii Informatycznej

Protokół ARP. dr Zbigniew Lipiński. Instytut Matematyki i Informatyki ul. Oleska Opole zlipinski@math.uni.opole.pl

Krótkie wprowadzenie do korzystania z OpenSSL

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

Iteracyjny serwer TCP i aplikacja UDP

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania. Programowanie systemów informatycznych laboratorium. Ćw. 3: Akwizycja danych. RS 232 cd.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Statystyka protokołów i połączeń sieciowych.

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Programowanie sieciowe

Języki i metodyka programowania. Wprowadzenie do języka C

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

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

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Część 4 życie programu

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Tworzenie aplikacji rozproszonej w Sun RPC

Podstawowe typy serwerów

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

TEMAT : KLASY POLIMORFIZM

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

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

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

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

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Gniazda BSD. komunikacja bezpołączeniowa

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

Projektowanie klas c.d. Projektowanie klas przykład

Instytut Teleinformatyki

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

Pytania sprawdzające wiedzę z programowania C++

Funkcja (podprogram) void

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie. Ćwiczenie Język C. Środowisko programowania Visual Studio

Platformy Programistyczne Zagadnienia sieciowe i wątki

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

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

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Wybrane działy Informatyki Stosowanej

Wstęp do programowania

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Wykład :37 PP2_W9

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

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

Obsługa wyjątków. Język C++ WW12

Gniazda BSD implementacja w C#

Przykłady interfejsu TCP i UDP w Javie

Ćwiczenia laboratoryjne. Oprogramowanie i badanie prostych metod sortowania w tablicach

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy Programowania

Operacje wejścia/wyjścia odsłona pierwsza

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

Co nie powinno być umieszczane w plikach nagłówkowych:

Listy i funkcje zaprzyjaźnione w C++

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

PHP: bloki kodu, tablice, obiekty i formularze

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

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

Programowanie - wykład 4

Podstawy języka skryptowego Lua

Komunikacja między sterownikami przez protokół ADS

Zasady programowania Dokumentacja

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

Protokół DNS. Aplikacja dnsquery

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Przesyłanie Pakietów Danych i TCP/IP

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

TRX API opis funkcji interfejsu

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Microsoft IT Academy kurs programowania

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Transkrypt:

Aplikacja Sieciowa Jedną z fundamentalnych właściwości wielu aplikacji jest możliwość operowania pomiędzy jednostkami (np. PC), które włączone są do sieci. W Windows operacja ta jest możliwa przy wykorzystaniu gniazdek czyli socketów. Programiści z firmy Microsoft ułatwili nam zadanie i nie musimy pisać naszych gniazdek od zera. Wykorzystamy gotowe funkcje znajdujące się w bibliotece winsock2. Zadanie na dzisiejszych zajęciach polega na stworzeniu aplikacji klienta, która będzie mogła wysyłać oraz odbierać dane od drugiego klienta. Dane zawsze wymieniane będą poprzez serwer. Serwer łączy kolejnych dwóch klientów w pary i pozwala im na prowadzenie wymiany danych. Serwer można pobrać z moodle, aplikacje klienta stworzymy według poniższych pleceń: Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project Następnie: Wpisujemy nazwę klient i wybieramy Finish. Uzyskujemy pusty projekt, który po uruchomieniu wyświetla konsolę. Teraz musimy stworzyć odpowiednią klasę, która umożliwi całkowitą komunikację z serwerem. Klasa nazywać będzie się CClientWSA natomiast plik nagłówkowy będzie miał postać: #pragma once #ifdef WIN32 #pragma comment(lib,"ws2_32") #endif

#include "winsock2.h" class CClientWSA { CClientWSA(void); ~CClientWSA(void); void initializewsa(); // inicjalizuje Winsock. void socketcreate(); // tworzy socket. void connecttoserver(const char * addr, unsigned short port); //połączenie z serwerem void senddata(); //wysyła sendbuff void receivedata(); //odbiera recvbuff void clearbuff(void);//czysci bufor wejsciowy i wyjsciowy SOCKET m_socket;//socket sockaddr_in clientservice; // struktura zwiazana z serwerem - patrz connecttoserver char sendbuf[32]; //bufor wyjściowy char recvbuf[32]; // bufor wejściowy int bytesrecv;//liczba otrzymanych bajtow; ; Ciekawostką jest tu jawne dodanie biblioteki winsock a : "ws2_32" Mamy już deklaracje, teraz dodajemy definicje (w odpowiednio nazwanym pliku): W konstruktorze oraz destruktorze nic się specjalnego nie dzieje więc zostawiamy puste. W inicjalizacji dodajemy kod, który umożliwi inicjalizację biblioteki obsługi gniazdek: WSADATA wsadata; int iresult = WSAStartup( MAKEWORD(2,2), &wsadata );//initialize Windows Sockets API if ( iresult!= NO_ERROR ) printf("error at WSAStartup()\n"); W metodzie odpowiedzialnej za tworzenie gniazdek wpisujemy: //tworzone jest gniazdo dla rodziny adresów (AdresFamily) sieci internet dla trybu //strumieniowego przesyłania danych), do obsługi tego trybu w seci internet służy protokół //TCP/IP (IPPROTO_TCP) m_socket = socket( AF_INET, SOCK_STREAM, 0 ); // tworzony jest socket if ( m_socket == INVALID_SOCKET ) { // obsługa błędu printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return; Kolejna metoda odpowiada za nawiązanie połączenia. Tutaj dopisujemy: //inicjowana jest struktura zawierające adres serwera i numer gniazda na którym on nasłuchuje //(10000) do własnych celów należy wykozystywać gniazda o numerze >1024. Adres IP //127.0.0.1 odpowiada lokalnemu komputerowi (localhost) clientservice.sin_family = AF_INET; clientservice.sin_addr.s_addr = inet_addr( addr); clientservice.sin_port = htons( port );//htons( 10000 );- konwersja zapsiu bitowego w bajtach if ( connect( m_socket, (SOCKADDR*) &clientservice, sizeof(clientservice) ) == SOCKET_ERROR) {

printf( "Failed to connect.\n" ); //obsługa błędu WSACleanup();//w przypadu błedu należy również odłączyć bibliotekę return; Metoda wysyłająca dane może mieć postać: //wysyła dane do gniazda serwera określonego przez m_socket. Z bufora sendbuff wysyłana //jest ilość bajtów podana przez strlen(sendbuf); int bytessent = send( m_socket, sendbuf, strlen(sendbuf), 0 ); printf( "Bytes Sent: %ld\n", bytessent ); Oczywiście musimy również odebrać dane (w odpowiedniej metodzie): //Odebrane dane są zapisywane do bufora recbuf, którego maksymalny rozmiar jet określony //w wywołaniu funkcji recv.ilość danych odczytanych jest zwracana do zmiennej bytesrecv bytesrecv = SOCKET_ERROR; while( bytesrecv == SOCKET_ERROR ) { bytesrecv = recv( m_socket, recvbuf, 32, 0 ); if ( bytesrecv == 0 bytesrecv == WSAECONNRESET ) { printf( "Connection Closed.\n"); break; if(bytesrecv < 0) return; printf( "Bytes Recv: %ld\n", bytesrecv ); Na samym końcu musimy dodać odpowiednią definicję metody czyszczącej bufory. Uwaga! W pliku definicji metod musimy zostać zawarta następująca preambuła: #include "stdafx.h" #include "ClientWSA.h" #include <stdio.h> Skończyliśmy pracę nad klasami. Teraz obsługa pliku gdzie zawarty jest nasz wątek główny czyli main. Najpierw dodajemy odpowiednie pliki oraz informujemy linker o dołączeniu biblioteki winsock a: #include "stdafx.h" #ifdef WIN32 #pragma comment(lib,"ws2_32") #endif #include "winsock2.h" #include "ClientWSA.h" #include "conio.h" #include <string> #include <iostream> #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <math.h>

#include <winsock.h> // our thread for recving commands using namespace std; Ciało naszego main a jest puste: int _tmain(int argc, _TCHAR* argv[]) { system("pause"); return 0; Teraz naszym zadaniem jest implementacja, następującego algorytmu w miejsce trzech kropek: Poprawnie napisana aplikacja pozwala na komunikacje pomiędzy klientami według obowiązujących zasad: a) Do uruchomionego serwer łączą się klient 1 oraz klient 2

b) Jeśli klient jako pierwszy bajt wyśle 1 wówczas ciąg znaków za 1 będzie traktowany jako dane do drugiego klienta (np. 1Hello do klienta drugiego wysłane zostanie Hello ) c) Jeśli klient jako pierwszy bajt wyśle 2 wówczas uzyska dane, które wysłał do niego drugi klient (bajty za 2 nie są brane pod uwagę) d) Komunikat nie zaczynający się na 1 lub 2 jest odbierany przez serwer, a następnie pomijany. Aplikacja może działać w obrębie jednej jednostki. Wtedy łączymy klientów z danym serwerem wpisując adres: 127.0.0.1. Uwaga: jako pierwszy zawsze uruchamiamy serwer. Sprawozdanie: 1. Chcemy, aby do serwera mogło połączyć się trzech klientów. Zmodyfikować kod serwera oraz klienta, tak, aby możliwym było przesyłanie informacji pomiędzy klientem 1, 2 oraz 3 według reguł: - jeśli pierwszy bajt jest równy 1 to dane są wysyłane do klienta 1, - jeśli pierwszy bajt jest równy 2 wówczas dane są przesyłane do klienta 2, - jeśli pierwszy bajt oznacza 3 dane są wysyłane do klienta 3, - jeśli pierwszy bajt jest równy 4 wówczas klient odbiera dane, które zostały do niego przesłane Dane wysyłane mogą być nadpisywane, natomiast odbiorca nie musi być informowany o tożsamości nadawcy. Dołączyć kod, który uległ modyfikacjom, wraz z komentarzem 2. Używając schematu blokowego proszę przedstawić algorytm interakcji pomiędzy klientem 1, klientem 2 oraz serwerem (dokładnie tak, jak ma to miejsce w naszym programie) uwzględniając fazę łączenia, wysyłania oraz odbierania informacji przez klientów (klient 1- >serwer->klient 2->serwer->klient 1).