home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / tcps.zip / tcptst-org.cpp < prev    next >
C/C++ Source or Header  |  2001-05-24  |  4KB  |  174 lines

  1. #define INCL_DOS
  2. #define INCL_DOSERRORS
  3. #include <os2.h>
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. #include <types.h>
  10. #include <utils.h>
  11. #include <netinet\in.h>
  12. #include <sys\socket.h>
  13. #include <sys\time.h>
  14. #include <sys\select.h>
  15. #include <netdb.h>
  16. #include <nerrno.h>
  17.  
  18. int iSocket = 0;
  19.  
  20. LONG InitService( int* piSocket,ushort usPort );
  21. BOOL Terminate( int* piSocket );
  22. VOID _System ServerAcceptConn( ULONG socket );
  23.  
  24. main( int argc, char* argv[] )
  25. {
  26.     if( !InitService( &iSocket,17700 ) )
  27.     {
  28.         DosSleep( 3000 );
  29.         Terminate( &iSocket );
  30.         DosSleep( 3000 );
  31.     }
  32. }
  33.  
  34. //------------------------------------------------------------------------------
  35. //
  36. //  InitService()
  37. //  Funktion:
  38. //  Parameters:
  39. //  Returnwert: keine.
  40. //------------------------------------------------------------------------------
  41. LONG InitService( int* piSocket,ushort usPort )
  42. {
  43.     APIRET  rc;
  44.     TID     tid;
  45.     struct sockaddr_in  server;
  46.  
  47.     // Socket-System initialisieren
  48.     //-----------------------------
  49.     if((sock_init()) !=0)
  50.     {
  51.         return sock_errno();
  52.     }
  53.  
  54.     // Erzeugen das socket
  55.     //---------------------
  56.     if( 0 > ( *piSocket = socket(AF_INET, SOCK_STREAM, 0) ) )
  57.     {
  58.         return sock_errno();
  59.     }
  60.  
  61.     // Bind socket to   port nummber
  62.     //------------------------------
  63.     server.sin_family      = AF_INET;
  64.     server.sin_port        = htons( usPort );
  65.     server.sin_addr.s_addr = INADDR_ANY;
  66.     if( bind( *piSocket, (sockaddr *)&server, sizeof(server)) < 0 )
  67.     {
  68.         rc = sock_errno();
  69.         soclose( *piSocket );
  70.         *piSocket = 0;
  71.         return rc;
  72.     }
  73.  
  74.     // Create connection request queue for 10 incomming connection request
  75.     //--------------------------------------------------------------------
  76.     if( 0 != listen( *piSocket,10 ) )
  77.     {
  78.         rc = sock_errno();
  79.         soclose( *piSocket );
  80.  
  81.         *piSocket = 0;
  82.         return rc;
  83.     }
  84.  
  85.  
  86.     // Create thread for listen
  87.     //-------------------------
  88.     if ( NO_ERROR != ( rc = DosCreateThread( &tid,
  89.                                              (PFNTHREAD)ServerAcceptConn,
  90.                                              *piSocket,
  91.                                              0,
  92.                                              4 * 4096) ) )
  93.     {
  94.         soclose( *piSocket );
  95.  
  96.         *piSocket = 0;
  97.     }
  98.  
  99.     return rc ;
  100. }
  101.  
  102. //------------------------------------------------------------------------------
  103. //
  104. //  Terminate()
  105. //
  106. //  Funktion:
  107. //
  108. //  Parameters:
  109. //
  110. //  Returnwert: keine.
  111. //
  112. //------------------------------------------------------------------------------
  113. BOOL Terminate( int* piSocket )
  114. {
  115.     // close the listener socket
  116.     //--------------------------
  117.     if( *piSocket )
  118.     {
  119.         printf( "Socket %d will be closed .... \n",*piSocket );
  120.         soclose( *piSocket );
  121.         printf( "Socket %d closed .... \n",*piSocket );
  122.         *piSocket = 0;
  123.     }
  124.  
  125.     return TRUE;
  126. }
  127.  
  128. //----------------------------------------------------------------------------
  129. // ServerAcceptConn
  130. //----------------------------------------------------------------------------
  131. // Short Description:
  132. // Function:
  133. // Parameter: ULONG
  134. // Return:
  135. //----------------------------------------------------------------------------
  136. VOID _System ServerAcceptConn(ULONG socket)
  137. {
  138.     int iNameLen;
  139.     struct sockaddr_in client;
  140.     int ns = 0;
  141.  
  142.     printf( "Thread for acept connetctions started\n" );
  143.     for(;;)
  144.     {
  145.         iNameLen = sizeof(client);
  146.         ns = accept( (int)socket, (sockaddr *)&client, &iNameLen);
  147.         if( -1 == ns )
  148.         {
  149.             ns = sock_errno();
  150.  
  151.             printf( "accept returns %d\n", ns );
  152.             // check if socket closed
  153.             //-----------------------
  154.             if( ns == ENOTSOCK )
  155.             {
  156.                 // terminate thread
  157.                 //-----------------
  158.                 break;
  159.             }
  160.             else
  161.             {
  162.                 // if the line below commented out it works fine
  163.                 // DosSleep( 100 );
  164.             }
  165.         }
  166.         else
  167.         {
  168.             // Do something
  169.         }
  170.     } // end for
  171.     printf( "Thread for acept connetctions terminated\n" );
  172. }
  173.  
  174.