00001 #ifndef __J2K__UDP_SocketClient_CPP__
00002 #define __J2K__UDP_SocketClient_CPP__
00003
00004 #include <j2k/Net/UDP/UDP_SocketClient.hpp>
00005
00006 UDP_SocketClient::UDP_SocketClient( char* srvNameAddress, short TFTP_Port )
00007 : UDP_Socket()
00008 {
00009 memset( &dest, 0, sizeof( struct sockaddr_in ) );
00010
00011 getHostData( srvNameAddress );
00012
00013 dest.sin_family = PF_INET;
00014 dest.sin_addr = *(in_addr*)( hostdata->h_addr_list[0] );
00015 dest.sin_port = htons( TFTP_Port );
00016
00017
00018
00019 memset( &server, 0, sizeof( struct sockaddr_in ) );
00020
00021 server.sin_family = PF_INET;
00022 server.sin_addr.s_addr = htonl( INADDR_ANY );
00023 server.sin_port = htons( TFTP_Port );
00024
00025 mySocket = socket( PF_INET, SOCK_DGRAM, 0 );
00026
00027 if ( mySocket < 0 )
00028 {
00029 printf( "Error: listen socket creation failed\n" );
00030 }
00031
00032
00033 PrintInfo();
00034 int ThreadID;
00035 pthread_t thread;
00036 ThreadID = pthread_create( &thread, 0,
00037 UDP_SocketClient::ListenThread,
00038 (void*)this
00039 );
00040 if ( ThreadID )
00041 {
00042 printf("Error creating listen thread\n");
00043 exit( 3 );
00044 }
00045 }
00046
00047 void* UDP_SocketClient::ListenThread( void* data )
00048 {
00049 UDP_SocketClient* me = (UDP_SocketClient*)data;
00050
00051 int serverAddrLength = sizeof( me->server );
00052
00053 while( 1 )
00054 {
00055
00056 memset( me->buffer, 0, UDP_BUFFER_SIZE );
00057
00058 int result = recvfrom( me->mySocket,
00059 me->buffer,
00060 UDP_BUFFER_SIZE, 0,
00061 (struct sockaddr *) &me->server,
00062 (socklen_t *) &serverAddrLength
00063 );
00064
00065 size_t pduLength = result;
00066 if ( pduLength > 60 ) pduLength = 60;
00067
00068
00069
00070 if ( result >= 0 )
00071 {
00072 printf( "Received %d bytes\n", result);
00073 printf( "Message received from host %s port %i\n",
00074 inet_ntoa( me->server.sin_addr ),
00075 ntohs( me->server.sin_port )
00076 );
00077
00078 option.showChar( "Received:", (char*)me->buffer, pduLength );
00079
00080 fflush( stdout );
00081
00082
00083 UDP_CALLBACK();
00084
00085 fflush( 0 );
00086
00087 } else if ( result < -1 ) {
00088 printf( "[%d]", result );
00089 printf( "Error while receiving message: recvfrom() < 0 " );
00090 fflush( stdout );
00091 }
00092
00093 if ( me->dest.sin_addr.s_addr != me->server.sin_addr.s_addr )
00094 {
00095
00096 printf( "Error, received message from else where!\n" );
00097 exit( 4 );
00098 }
00099 }
00100 }
00101
00102
00103 inline BOOL UDP_SocketClient::send( void* msg, size_t msgLength )
00104 {
00105 return UDP_Socket::send( msg, msgLength, &dest );
00106 }
00107
00108 inline UDP_SocketClient::~UDP_SocketClient() { }
00109
00110 #endif
00111
00112
00113
00114
00115