Lokalnie gniazda BSD klient <-> serwer
Ostatnio zmodyfikowano 2013-11-29 23:41
tirou Temat założony przez niniejszego użytkownika |
Lokalnie gniazda BSD klient <-> serwer » 2013-11-29 21:30:07 Witam forumowiczów. Napisalem pod ubuntu program klienta, oraz program serwera. Jest to transmisja połaczeniowa, serwera nasluchuje na polaczenie od klienta ->klient wysyla znak -> serwer zmienia go i odpowiada (w teorii). Jednak pomimo tego, że mam oba programy, które kompiluja się w terminalu nie łączą się ze soba. Uruchamiam programy klienta oraz serwera tak, że otwieram 2 terminale i w kazdym z nich wywoluje program. Jednak nie komunikują się ze sobą tak jak planowałem, stąd moje pytanie: Jak lokalnie na Ubuntu emulować polaczenie klient <-> serwer ?klient: #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> void blad() { perror( "Blad klienta." ); exit( 1 ); } int main() { int gniazdo_klienta; int serwer_dlugosc; int klient_dlugosc; char znak = 'a'; int test1, test2; struct sockaddr_un adres_serwera; struct sockaddr_un adres_klienta; unlink( "gniazdo_klienta" ); test1 = gniazdo_klienta = socket( AF_UNIX, SOCK_DGRAM, 0 ); if( test1 ==- 1 ) blad(); adres_klienta.sun_family = AF_UNIX; strcpy( adres_klienta.sun_path, "gniazdo_klienta" ); klient_dlugosc = sizeof( adres_klienta ); test2 = bind( gniazdo_klienta,( struct sockaddr * ) & adres_klienta, klient_dlugosc ); if( test2 ==- 1 ) blad(); adres_serwera.sun_family = AF_UNIX; strcpy( adres_serwera.sun_path, "gniazdo_serwera" ); serwer_dlugosc = sizeof( adres_serwera ); sendto( gniazdo_klienta, & znak, 1, 0,( struct sockaddr * ) & adres_serwera, serwer_dlugosc ); printf( "Wyslalem do serwera znak %c.\n", znak ); recvfrom( gniazdo_klienta, & znak, 1, 0,( struct sockaddr * ) & adres_serwera,( socklen_t * ) & serwer_dlugosc ); printf( "Otrzymalem od serwera znak %c.\n", znak ); close( gniazdo_klienta ); exit( 0 ); }
//Serwer: #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> void blad() { perror( "Blad serwera." ); exit( 1 ); }
int main() { int gniazdo_serwera; int gniazdo_dla_klienta; int serwer_dlugosc; int klient_dlugosc; int test1, test2, test3, test4, test5; char znak; struct sockaddr_un adres_serwera; struct sockaddr_un adres_klienta; unlink( "gniazdo_serwera" ); test1 = gniazdo_serwera = socket( AF_UNIX, SOCK_STREAM, 0 ); if( test1 ==- 1 ) blad(); adres_serwera.sun_family = AF_UNIX; strcpy( adres_serwera.sun_path, "gniazdo_serwera" ); serwer_dlugosc = sizeof( adres_serwera ); test2 = bind( gniazdo_serwera,( struct sockaddr * ) & adres_serwera, serwer_dlugosc ); if( test2 ==- 1 ) blad(); test3 = listen( gniazdo_serwera, 5 ); if( test3 ==- 1 ) blad(); printf( "Serwer nasluchuje...\n" ); while( 1 ) { gniazdo_dla_klienta = accept( gniazdo_serwera,( struct sockaddr * ) & adres_klienta,( socklen_t * ) & klient_dlugosc ); test4 = read( gniazdo_dla_klienta, & znak, 1 ); if( test4 > 0 ) printf( "Odebralem do klienta znak %c.\n", znak ); else blad(); znak = 'b'; test5 = write( gniazdo_dla_klienta, & znak, 1 ); if( test5 > 0 ) printf( "Wysylam dane do klienta znak %c.\n", znak ); else blad(); close( gniazdo_dla_klienta ); } close( gniazdo_serwera ); exit( 0 ); }
|
|
DejaVu |
» 2013-11-29 23:41:22 A jak to niby ma działać, skoro jedna aplikacja używa TCP, a druga UDP? /edit: Napisalem pod ubuntu program klienta, oraz program serwera.
|
Poza tym to nie jest Twój kod. http://jpnowicki.com/jpn_bsd.pdf |
|
« 1 » |