• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pytanie dotyczące programów serwera i klienta gniazd datagramowych w C++ na Linuxie Ubuntu.

Object Storage Arubacloud
0 głosów
73 wizyt
pytanie zadane 17 marca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)

Witam.

Posiadam takie o to dwa kody klienta i serwera i moje pytanie brzmi może banalnie, a mianowicie jak je uruchomić żeby to zadziałało. Kody nie są moje, chcę tylko zobaczyć efekt. Dopiero zaczynam w programowaniu sieciowym i od paru dni męczę się z uruchomieniem tego. Proszę o pomoc.

Ps. Dodam tylko, że funkcje użyte w kodach mam w miarę opanowane, ale dla pewności byłbym wdzięczny jakby ktoś sprawdził poprawność kodu.

Tutaj serwer:

/*
    ** listener.c -- serwer używający gniazd datagramowych
    */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MYPORT 4950    // port, z którym użytkownicy będą się łączyli

#define MAXBUFLEN 100

int main( void )
{
    int sockfd;
    struct sockaddr_in my_addr; // informacja o moim adresie
    struct sockaddr_in their_addr; // informacja o adresie osoby łączącej się
    int addr_len, numbytes;
    char buf[ MAXBUFLEN ];
    
    if(( sockfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) == - 1 ) {
        perror( "socket" );
        exit( 1 );
    }
    
    my_addr.sin_family = AF_INET; // host byte order
    my_addr.sin_port = htons( MYPORT ); // short, network byte order
    my_addr.sin_addr.s_addr = INADDR_ANY; // uzupełnij moim adresem IP
    memset( &( my_addr.sin_zero ), '\0', 8 ); // wyzeruj resztę struktury
    
    if( bind( sockfd,( struct sockaddr * ) & my_addr,
    sizeof( struct sockaddr ) ) == - 1 ) {
        perror( "bind" );
        exit( 1 );
    }
    
    addr_len = sizeof( struct sockaddr );
    if(( numbytes = recvfrom( sockfd, buf, MAXBUFLEN - 1, 0,
    ( struct sockaddr * ) & their_addr, & addr_len ) ) == - 1 ) {
        perror( "recvfrom" );
        exit( 1 );
    }
    
    printf( "got packet from %s\n", inet_ntoa( their_addr.sin_addr ) );
    printf( "packet is %d bytes long\n", numbytes );
    buf[ numbytes ] = '\0';
    printf( "packet contains \"%s\"\n", buf );
    
    close( sockfd );
    
    return 0;
}

A tutaj klient:

/*
    ** talker.c -- klient używający gniazd datagramowych
    */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define MYPORT 4950    // port, z którym będą się łączyli użytkownicy

int main( int argc, char * argv[] )
{
    int sockfd;
    struct sockaddr_in their_addr; // informacja o adresie osoby łączącej się
    struct hostent * he;
    int numbytes;
    
    if( argc != 3 ) {
        fprintf( stderr, "usage: talker hostname message\n" );
        exit( 1 );
    }
    
    if(( he = gethostbyname( argv[ 1 ] ) ) == NULL ) { // pobierz informacje o hoście
        perror( "gethostbyname" );
        exit( 1 );
    }
    
    if(( sockfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) == - 1 ) {
        perror( "socket" );
        exit( 1 );
    }
    
    their_addr.sin_family = AF_INET; // host byte order
    their_addr.sin_port = htons( MYPORT ); // short, network byte order
    their_addr.sin_addr = *(( struct in_addr * ) he->h_addr );
    memset( &( their_addr.sin_zero ), '\0', 8 ); // wyzeruj resztę struktury
    
    if(( numbytes = sendto( sockfd, argv[ 2 ], strlen( argv[ 2 ] ), 0,
    ( struct sockaddr * ) & their_addr, sizeof( struct sockaddr ) ) ) == - 1 ) {
        perror( "sendto" );
        exit( 1 );
    }
    
    printf( "sent %d bytes to %s\n", numbytes,
    inet_ntoa( their_addr.sin_addr ) );
    
    close( sockfd );
    
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 17 marca 2019 przez j23 Mędrzec (194,920 p.)

Jeśli chodzi Ci o kompilację, to

gcc listener.c -o listener && gcc talker.c -o talker

A jeśli o wywołanie, to

./listener &
./talker localhost "Hello World!"

 

Podobne pytania

0 głosów
1 odpowiedź 460 wizyt
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 23 kwietnia 2021 w Systemy operacyjne, programy przez Kubunio Początkujący (270 p.)
0 głosów
4 odpowiedzi 1,035 wizyt
pytanie zadane 17 stycznia 2018 w C i C++ przez Artur Koniec Gaduła (3,670 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...