home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
tcps.zip
/
tcptst-org.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-05-24
|
4KB
|
174 lines
#define INCL_DOS
#define INCL_DOSERRORS
#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <types.h>
#include <utils.h>
#include <netinet\in.h>
#include <sys\socket.h>
#include <sys\time.h>
#include <sys\select.h>
#include <netdb.h>
#include <nerrno.h>
int iSocket = 0;
LONG InitService( int* piSocket,ushort usPort );
BOOL Terminate( int* piSocket );
VOID _System ServerAcceptConn( ULONG socket );
main( int argc, char* argv[] )
{
if( !InitService( &iSocket,17700 ) )
{
DosSleep( 3000 );
Terminate( &iSocket );
DosSleep( 3000 );
}
}
//------------------------------------------------------------------------------
//
// InitService()
// Funktion:
// Parameters:
// Returnwert: keine.
//------------------------------------------------------------------------------
LONG InitService( int* piSocket,ushort usPort )
{
APIRET rc;
TID tid;
struct sockaddr_in server;
// Socket-System initialisieren
//-----------------------------
if((sock_init()) !=0)
{
return sock_errno();
}
// Erzeugen das socket
//---------------------
if( 0 > ( *piSocket = socket(AF_INET, SOCK_STREAM, 0) ) )
{
return sock_errno();
}
// Bind socket to port nummber
//------------------------------
server.sin_family = AF_INET;
server.sin_port = htons( usPort );
server.sin_addr.s_addr = INADDR_ANY;
if( bind( *piSocket, (sockaddr *)&server, sizeof(server)) < 0 )
{
rc = sock_errno();
soclose( *piSocket );
*piSocket = 0;
return rc;
}
// Create connection request queue for 10 incomming connection request
//--------------------------------------------------------------------
if( 0 != listen( *piSocket,10 ) )
{
rc = sock_errno();
soclose( *piSocket );
*piSocket = 0;
return rc;
}
// Create thread for listen
//-------------------------
if ( NO_ERROR != ( rc = DosCreateThread( &tid,
(PFNTHREAD)ServerAcceptConn,
*piSocket,
0,
4 * 4096) ) )
{
soclose( *piSocket );
*piSocket = 0;
}
return rc ;
}
//------------------------------------------------------------------------------
//
// Terminate()
//
// Funktion:
//
// Parameters:
//
// Returnwert: keine.
//
//------------------------------------------------------------------------------
BOOL Terminate( int* piSocket )
{
// close the listener socket
//--------------------------
if( *piSocket )
{
printf( "Socket %d will be closed .... \n",*piSocket );
soclose( *piSocket );
printf( "Socket %d closed .... \n",*piSocket );
*piSocket = 0;
}
return TRUE;
}
//----------------------------------------------------------------------------
// ServerAcceptConn
//----------------------------------------------------------------------------
// Short Description:
// Function:
// Parameter: ULONG
// Return:
//----------------------------------------------------------------------------
VOID _System ServerAcceptConn(ULONG socket)
{
int iNameLen;
struct sockaddr_in client;
int ns = 0;
printf( "Thread for acept connetctions started\n" );
for(;;)
{
iNameLen = sizeof(client);
ns = accept( (int)socket, (sockaddr *)&client, &iNameLen);
if( -1 == ns )
{
ns = sock_errno();
printf( "accept returns %d\n", ns );
// check if socket closed
//-----------------------
if( ns == ENOTSOCK )
{
// terminate thread
//-----------------
break;
}
else
{
// if the line below commented out it works fine
// DosSleep( 100 );
}
}
else
{
// Do something
}
} // end for
printf( "Thread for acept connetctions terminated\n" );
}