Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C Linux - Sprawdzenie prostej apki (w C) klient-serwer pod Linuxem

bbxb 14 Cze 2015 22:49 840 10
  • #1 14 Cze 2015 22:49
    bbxb
    Poziom 31  

    Cześć,
    mam takie kody klienta i serwera jak poniżej. Kody te przepisałem z książki i mniej-więcej wiem o co chodzi. Natomiast nigdzie nie jest tam napisane jak to uruchomić i przetestować :) Czy możecie mi podpowiedzieć jak przetestować te kody?

    Klient ma wysyłać do serwera małe litery, serwer ma to zamieniać na duże i odsyłać do klienta.

    Serwer:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Klient:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dzięki za pomoc!

    0 10
  • Pomocny post
    #2 15 Cze 2015 00:31
    BeginEnd
    Poziom 14  

    Każdy z tych plików zapisujesz na dysku i wtedy

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Analogicznie z drugim plikiem.

    1
  • #3 15 Cze 2015 08:49
    bbxb
    Poziom 31  

    Ja wiem wiem ale mam pytanko... najpierw odpalam serwer tak?
    I ten serwer ma sobie działać cały czas a potem dopiero odpalam klienta?
    To wszystko w tym samym jednym terminalu?


    Pozdrawiam!

    0
  • Pomocny post
    #4 15 Cze 2015 10:38
    -psiak-
    Poziom 32  

    Możesz w tym samym tylko przełącz serwera w tło.
    Możesz odpalić serwera na screen'ie.
    Możesz użyć XWin i mieć dwie konsoli w dwóch okienkach.
    Możesz odpalić to na dwóch komputerach.
    Możesz ...
    Pełną lista wszystkich możliwości nie dam rady skończyć w tym roku nawet jeżeli będę siedział nad nią 8 godzin dziennie.
    Pamiętaj jedynie aby ustawić poprawnie IP:
    server.sin_addr.s_addr = inet_addr("197.45.10.2");

    1
  • #5 15 Cze 2015 20:21
    bbxb
    Poziom 31  

    Ale jak odpalę dwie kopie terminala i na jednej odpalę serwer a na drugiej klienta i ustawię odpowiednie ip to będzie działać?

    A to ip to mogę wziąć swojego lokalnego komputera z opcji ifconfig?
    Bo to chcę przetestować fizycznie na jednym komputerze... który jest podłączony do netu oczywiście...

    Dzięki!

    0
  • Pomocny post
    #6 15 Cze 2015 20:46
    -psiak-
    Poziom 32  

    zamień ten IP na:
    127.0.0.1
    lub na:
    localhost
    i będzie działać.

    1
  • #7 17 Cze 2015 23:12
    bbxb
    Poziom 31  

    Koledzy mam problem z kompilacja :cry:

    Mam takie kody przepisane i poprawione z ksiazki:

    Serwer:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Klient:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Te kody zrodlowe sa przepisane z ksiazki, ja dopisalem tylko wiecej includow zeby niczego nie zabraklo przy kompilacji a jednak wywala mi takie bledy:

    Code:
    bbxb@ubuntu:~$ gcc -o serwer serwer.c
    
    serwer.c: In function ‘main’:
    serwer.c:30:9: error: invalid initializer
      struct sockaddr_in server = (AF_INET, 7000, INADDR_ANY);
             ^
    bbxb@ubuntu:~$ gcc -o klient klient2.c
    klient2.c: In function ‘main’:
    klient2.c:24:9: error: invalid initializer
      struct sockaddr_in server = (AF_INET, 7000);
             ^
    bbxb@ubuntu:~$


    Jak naprawic ten problem zeby sie skompilowalo poprawnie?


    Pozdrawiam!

    0
  • Pomocny post
    #8 18 Cze 2015 10:58
    -psiak-
    Poziom 32  

    Nawiasy mają być klamrowe.

    1
  • #9 18 Cze 2015 11:02
    bbxb
    Poziom 31  

    Tak to jest jak się przepisuje z zeskanowanej książki z 1996 roku :)

    0
  • #10 27 Cze 2015 18:32
    bbxb
    Poziom 31  

    Cześć!
    Niedługo mam egzamin z tego i chciałbym abyście ocenili moje odpowiedzi.
    Jak gdzieś jest błąd to proszę o info :)

    1. Uzupełnić poniższy kod klienta tak, aby zapewnić sprawdzanie czy druga strona nie zamknęła połączenia. Sprawdzanie jest realizowane podczas czytania.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Odpowiedź:
    if(ret<0) {
    printf(„Druga strona zamknęła połączenie”);
    }

    Trzeba sprawdzić czy funkcja read nie zwróciła wartości -1 co oznaczałoby że wystąpił błąd.

    2. Uzupełnić poniższy kod serwera tak, aby zapewnić sprawdzanie czy druga strona nie zamknęła połączenia. Sprawdzanie jest realizowane podczas zapisu.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Odpowiedź:
    if(ret<0 || ret<size) {
    printf(„Druga strona zamknęła połączenie”);
    }

    Trzeba sprawdzić czy funkcja write nie zwróciła wartości -1 co oznaczałoby że wystąpił błąd i czy ilość wysłanych danych nie jest mniejsza od wielkości bufora którą wysyłamy.

    3. Napisać pseudokod serwera wielopołączeniowego wieloprocesowego, zaznaczyć i wytłumaczyć miejsca, w których może się zablokować.
    Code:
    gniazdo = socket() 
    
    bind(gniazdo, adres, rozmiar)
    listen(gniazdo,5)
    gniazdo2 = accept(gniazdo) // tu jest zatrzymanie bo czekamy na polaczenie klienta
     if ((wartosc = fork() ) ==0)
    zamknij gniazdo
    przetrwarzaj kilenta
     if( wartosc > 0 )
     zamknij gniazdo2
    else
    error
    zamknij gniazdo2


    Mam jeszcze problem i nie wiem jak ugryźć te pytania:
    4. Co może wpływać na opóźnienie serwera wieloprocesowego iteracyjnego?
    5. Kiedy gniazdo klienta dostaje adres lokalny?

    Za każdą pomoc bardzo dziękuję!

    Pozdrawiam.

    0
  • Pomocny post
    #11 28 Cze 2015 22:58
    BeginEnd
    Poziom 14  

    bbxb napisał:
    if(ret<0) {
    printf(„Druga strona zamknęła połączenie”);
    }


    Dawno nie używałem socketów, ale chyba powinno być ret == 0. Tak przynajmniej google podpowiada (Link). Dalej podobnie. Zawsze możesz skompilować i sprawdzić co zwróci read() w tym przypadku.

    1