home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
tcps.zip
/
tcptst-timer.c
< prev
next >
Wrap
C/C++ Source or Header
|
2001-05-24
|
4KB
|
153 lines
#define INCL_DOS
#define INCL_DOSPROCESS
#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;
//To get thread information.
PTIB ptib = NULL; // Thread information block structure.
PPIB ppib = NULL; // Process information block structre.
LONG InitService( int * piSocket,ushort usPort );
BOOL Terminate( int * piSocket );
VOID _System ServerAcceptConn( ULONG socket );
main( int argc, char* argv[] )
{
APIRET rc = NO_ERROR ;// Return code.
rc = DosGetInfoBlocks(&ptib, &ppib);
printf("Main Thread: Tid %ld\n",ptib->tib_ordinal);
if( !InitService( &iSocket,17701 ) )
{
DosSleep( 3000 );
Terminate( &iSocket );
DosSleep( 3000 );
}
}
// InitService()
LONG InitService( int* piSocket,ushort usPort )
{
APIRET rc;
TID tid;
struct sockaddr_in server;
if((sock_init()) !=0)
{
return sock_errno();
}
if(( *piSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
return sock_errno();
}
server.sin_family = AF_INET;
server.sin_port = htons( usPort );
server.sin_addr.s_addr = INADDR_ANY;
if( bind(*piSocket,(struct sockaddr *)&server, sizeof(server)) < 0)
{
rc = sock_errno();
soclose( *piSocket );
*piSocket = 0;
return rc;
}
rc = DosGetInfoBlocks(&ptib, &ppib);
printf("Main Thread: InitService Thread: Tid %ld\n",ptib->tib_ordinal);
if( listen( *piSocket,10 ) != 0)
{
rc = sock_errno();
soclose( *piSocket );
*piSocket = 0;
return rc;
}
if ( NO_ERROR != ( rc = DosCreateThread( &tid,
(PFNTHREAD)ServerAcceptConn,
*piSocket,
0,
4 * 4096) ) )
{
soclose( *piSocket );
*piSocket = 0;
}
return rc ;
}
// Terminate()
BOOL Terminate( int* piSocket )
{
APIRET rc = NO_ERROR ;// Return code.
rc = DosGetInfoBlocks(&ptib, &ppib);
if( *piSocket )
{
printf( "Terminate: Socket %d will be closed.Thread id %ld \n",*piSocket,ptib->tib_ordinal);
soclose( *piSocket );
printf( "Terminate: Socket %d closed.Thread id %ld \n",*piSocket,ptib->tib_ordinal);
*piSocket = 0;
}
return TRUE;
}
// ServerAcceptConn
VOID _System ServerAcceptConn(ULONG socket)
{
int iNameLen;
struct sockaddr_in client;
int ns = 0,i;
APIRET rc;
rc = DosGetInfoBlocks(&ptib, &ppib);
printf("ServerAcceptConn: Thread id - %ld \n",ptib->tib_ordinal);
for(i=0;i<2;i++) /* I am going to do accept only twice.Earlier it was
* for done indefintely in code supplied by customer.
*/
{
iNameLen = sizeof(client);
/* Ensuring SoClose happens before accept call wait for 5secs */
/* Tcptst-timerset.exe has DosSleep enabled */
/* Tcptst-timernotset.exe has DosSleep commented(disabled) */
DosSleep(5000);
ns = accept((int)socket, (struct sockaddr *)&client, &iNameLen);
if( -1 == ns )
{
ns = sock_errno();
printf( "ServerAcceptConn: Accept returns %d.\n", ns);
// check if socket closed
//-----------------------
if( ns == ENOTSOCK )
{
break;
}
else
{
}
}
else
{
printf("Accept succeded \n");
}
} // end for
printf( "ServerAcceptConn: Thread for acept connetctions terminated.\n");
}