home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / tcpsotes.zip / tcptst.c < prev    next >
C/C++ Source or Header  |  2001-06-04  |  3KB  |  133 lines

  1. #define INCL_DOS
  2. #define INCL_DOSPROCESS
  3. #define INCL_DOSERRORS
  4. #include <os2.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <types.h>
  9. #include <utils.h>
  10. #include <netinet\in.h>
  11. #include <sys\socket.h>
  12. #include <sys\time.h>
  13. #include <sys\select.h>
  14. #include <netdb.h>
  15. #include <nerrno.h>
  16.  
  17. int iSocket = 0;
  18.  
  19. LONG InitService( int * piSocket,ushort usPort );
  20. BOOL Terminate( int * piSocket );
  21. VOID _System ServerAcceptConn( );
  22.  
  23. main( int argc, char* argv[] )
  24. {
  25.    APIRET rc = NO_ERROR ;// Return code.
  26.  
  27.     if( !InitService( &iSocket,17701 ) )
  28.     {
  29.         DosSleep( 3000 );
  30.         Terminate( &iSocket );
  31.         DosSleep( 3000 );
  32.     }
  33. }
  34.  
  35. //  InitService()
  36. LONG InitService( int* piSocket,ushort usPort )
  37. {
  38.     APIRET  rc;
  39.     TID     tid;
  40.     struct sockaddr_in  server;
  41.     int iNameLen;
  42.     int ns = 0;
  43.     struct sockaddr_in client;
  44.  
  45.  
  46.     printf("Socket Initialized: sock_init()\n");
  47.     if((sock_init()) !=0)
  48.     {
  49.         return sock_errno();
  50.     }
  51.  
  52.     printf("Socket creation: socket()\n");
  53.     if(( *piSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
  54.     {
  55.         return sock_errno();
  56.     }
  57.  
  58.     server.sin_family      = AF_INET;
  59.     server.sin_port        = htons( usPort );
  60.     server.sin_addr.s_addr = INADDR_ANY;
  61.     printf("Socket binding :bind()\n");
  62.     if( bind(*piSocket,(struct sockaddr *)&server, sizeof(server)) < 0)
  63.     {
  64.         rc = sock_errno();
  65.         soclose( *piSocket );
  66.         *piSocket = 0;
  67.         return rc;
  68.     }
  69.  
  70.     printf("Listening on the main Socket: listen()\n");
  71.     if( listen( *piSocket,10 ) != 0)
  72.     {
  73.         rc = sock_errno();
  74.         soclose( *piSocket );
  75.         *piSocket = 0;
  76.         return rc;
  77.     }
  78.     /* Now do an accept This ensures that we are not killing the main
  79.        listening socket */
  80.     for(;;)
  81.     {
  82.         iNameLen = sizeof(client);
  83.         printf("Accept any Socket connections made by peer: accept()\n");
  84.         ns = accept((int)*piSocket, (struct sockaddr *)&client, &iNameLen);
  85.         if( -1 == ns )
  86.         {
  87.             ns = sock_errno();
  88.  
  89.             printf( "ServerAcceptConn: Accept returns %d.\n", ns);
  90.             if( ns == ENOTSOCK )
  91.                 break;
  92.         }
  93.         else
  94.         {
  95.             printf("Accept succeded \n");
  96.         }
  97.     } // end for
  98.  
  99.     printf("Fork a process for any processing to be done \n");
  100.     printf("on newly created Socket by accept call\n");
  101.     if ( NO_ERROR != ( rc = DosCreateThread( &tid,
  102.                                              (PFNTHREAD)ServerAcceptConn,
  103.                                              NULL,
  104.                                              0,
  105.                                              4 * 4096) ) )
  106.     {
  107.         soclose( *piSocket );
  108.         *piSocket = 0;
  109.     }
  110.     return rc ;
  111. }
  112.  
  113. // ServerAcceptConn
  114. VOID _System ServerAcceptConn()
  115. {
  116.  
  117.     printf("ServerAcceptConn:\n");
  118.  
  119. }
  120. //  Terminate()
  121. BOOL Terminate( int* piSocket )
  122. {
  123.    APIRET rc = NO_ERROR ;// Return code.
  124.  
  125.     if( *piSocket )
  126.     {
  127.         printf( "Terminate: Socket %d will be closed.\n");
  128.         soclose( *piSocket );
  129.         *piSocket = 0;
  130.     }
  131.     return TRUE;
  132. }
  133.