/* highscore-client.c -- The hiscore client using TCP/IP stream. Created on: 2008/12/06 17:03:28 ~yas/dsys/highscore/tcp/highscore-client.c */ #include /* stderr, fprintf() */ #include /* strtol() */ #include /* memcpy() */ #include /* socket() */ #include /* socket() */ #include /* struct sockaddr_in */ #include /* getaddrinfo(), freeaddrinfo(), struct addrinfo */ #include "highscore-tcp.h" #include "marshaling-burffer.h" /* From Coins System Program */ extern int tcp_connect( char *server, int portno ); extern int sockaddr_in_init( struct sockaddr_in *addr, int addrlen, char *hostname, int portno ); int get_highscore_client( char *server, int portno, score_record_t records[], int len ) { int sock, cmd, n, i; marbuf_t request, reply; marbuf_init( &request,HISCORE_PROTO_MAX_MESSAGE_SIZE ); marbuf_init( &reply,HISCORE_PROTO_MAX_MESSAGE_SIZE ); if( !marbuf_marshal_int( &request, HISCORE_PROTO_GET_HISCORE ) ) goto error0; marbuf_marshal_int( &request, len ); if( (sock = tcp_connect( server, portno )) < 0 ) { perror("tcp_sonnect"); goto error0; } if( marbuf_send_message( &request, sock ) < 0 ) { perror("send"); goto error1; } if( marbuf_receive_message( &reply, sock ) < 0 ) { perror("recieve"); goto error1; } if( !marbuf_unmarshal_int( &reply, &n ) ) { fprintf(stderr,"unmarshal n\n"); goto error1; } if( n > len ) { fprintf(stderr,"received message too large: %d > %d\n", n, len ); goto error1; } for( i=0 ; i (%d)\n", addrlen, sizeof(struct sockaddr_in) ); return( -1 ); } memset( &hints, 0, sizeof(hints) ); hints.ai_family = AF_INET ; /* IPv4 */ if( (err = getaddrinfo( hostname, NULL, &hints, &ai )) ) { fprintf(stderr,"unknown host %s (%s)\n",hostname, gai_strerror(err) ); return( -1 ); } if( ai->ai_addrlen > addrlen ) { fprintf(stderr,"sockaddr too large (%d) > (%d)\n", ai->ai_addrlen,sizeof(addr) ); freeaddrinfo( ai ); return( -1 ); } memcpy( addr, ai->ai_addr, ai->ai_addrlen ); addr->sin_port = htons( portno ); freeaddrinfo( ai ); return( 0 ); }