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;
}