Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lokalnie gniazda BSD klient <-> serwer

Ostatnio zmodyfikowano 2013-11-29 23:41
Autor Wiadomość
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:

C/C++
#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;
   
    //Usuniecie starego gniazda klienta
    unlink( "gniazdo_klienta" );
   
    //Utworzenie gniazda klienta
    test1 = gniazdo_klienta = socket( AF_UNIX, SOCK_DGRAM, 0 );
    if( test1 ==- 1 ) blad();
   
    //Zwiazanie gniazda klienta z adresem
    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();
   
    //Ustalenie adresu serwera
    adres_serwera.sun_family = AF_UNIX;
    strcpy( adres_serwera.sun_path, "gniazdo_serwera" );
    serwer_dlugosc = sizeof( adres_serwera );
   
    //Klient wysyla wiadomosc do serwera
    sendto( gniazdo_klienta, & znak, 1, 0,( struct sockaddr * ) & adres_serwera, serwer_dlugosc );
    printf( "Wyslalem do serwera znak %c.\n", znak );
   
    //Klient odbiera od serwera zmodyfikowana wiadomosc
    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:
C/C++
#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;
   
    //Usuniecie starego gniazda
    unlink( "gniazdo_serwera" );
   
    //Utworzenie gniazda serwera
    test1 = gniazdo_serwera = socket( AF_UNIX, SOCK_STREAM, 0 );
    if( test1 ==- 1 ) blad();
   
    //Zwiazanie gniazda serwera z adresem
    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();
   
    //Utworzenie kolejki dla oczekujacych polaczen
    test3 = listen( gniazdo_serwera, 5 );
    if( test3 ==- 1 ) blad();
   
    printf( "Serwer nasluchuje...\n" );
   
    //Komunikacja gniazda serwera z gniazdem klienta
    while( 1 )
    {
        //Przyjęcie polaczenia przez gniazdo serwera
        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 );
}
P-97874
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
P-97878
« 1 »
  Strona 1 z 1