#include #include #include #include #include #include #include #include #include #define PORT 3490 #define MAXDATASIZE 100 int main( int argc, char *argv[] ) { int sockfd, numbytes, localport; char buf[ MAXDATASIZE ]; struct sockaddr_in their_addr, my_addr; if ( argc != 3 ) { fprintf( stderr, "usage: client hostip localport\n" ); exit( 1 ); } if ( ( localport = atoi( argv[ 2 ] ) ) == 0 ) { fprintf( stderr, "ERROR: localport should be an "\ "integer, '%s' was given.\n", argv[ 2 ] ); exit( 1 ); } if ( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 ) { perror( "socket" ); exit( 1 ); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons( localport ); my_addr.sin_addr.s_addr = INADDR_ANY; memset( &( my_addr.sin_zero ), '\0', 8 ); if ( bind( sockfd, (struct sockaddr *)&my_addr, sizeof( struct sockaddr ) ) == -1 ) { perror( "bind" ); exit( 1 ); } their_addr.sin_family = AF_INET; their_addr.sin_port = htons( PORT ); if ( inet_pton( AF_INET, argv[ 1 ], &their_addr.sin_addr ) <= 0 ) { perror( "inet_pton" ); exit( 1 ); } memset( &( their_addr.sin_zero ), '\0', 8 ); if ( connect( sockfd, ( struct sockaddr * )&their_addr, sizeof( struct sockaddr ) ) == -1 ) { perror( "connect" ); exit( 1 ); } { struct sockaddr_in name; int sin_size = sizeof( struct sockaddr_in ); if ( getsockname( sockfd, (struct sockaddr *) &name, &sin_size ) == -1 ) { perror( "getsockname" ); exit( 1 ); } printf( "client: connected using local %s:%d\n", inet_ntoa( name.sin_addr ), ntohs( name.sin_port)); } if ( ( numbytes = recv( sockfd, buf, MAXDATASIZE-1, 0 ) ) == -1 ) { perror( "recv" ); exit( 1 ); } buf[ numbytes ] = '\0'; printf( "Received: %s", buf ); close( sockfd ); return 0; } /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */