Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Net/UDP/UDP_SocketClient.cpp

Go to the documentation of this file.
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    // Server part:
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    // Start thread
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 )  // Infinite loop
00054    {
00055       // Clear buffer
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       // We retrieve the client name from recvfrom()
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          // Call TFTP_PacketParser
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 // Send a message
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 

Generated on Sun Oct 14 18:46:35 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001