added socket unblock mechanism test

This commit is contained in:
Jeff Hill
2004-05-12 20:51:25 +00:00
parent ce29419d3d
commit 965a511c47
3 changed files with 98 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
#include <assert.h>
#include "osiSock.h"
#include "osiWireFormat.h"
#include "epicsThread.h"
#include "epicsSignal.h"
static SOCKET s;
static bool wakeup = false;
void socketJoltTest ( void * )
{
char buf [1];
int status = recv ( s, buf, (int) sizeof ( buf ), 0 );
wakeup = true;
}
void blockingSockTest ()
{
s = epicsSocketCreate ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
assert ( s != INVALID_SOCKET );
epicsUInt16 port = 5071;
union {
struct sockaddr_in ia;
struct sockaddr sa;
} bd;
memset ( (char *) &bd, 0, sizeof ( bd ) );
bd.ia.sin_family = AF_INET;
bd.ia.sin_addr.s_addr = epicsHTON32 ( INADDR_ANY );
bd.ia.sin_port = epicsHTON16 ( port );
int status = bind ( s, &bd.sa, sizeof ( bd ) );
assert ( status == 0 );
wakeup = false;
epicsThreadId id = epicsThreadCreate ( "Socket Jolt Test", epicsThreadPriorityMedium,
epicsThreadGetStackSize(epicsThreadStackMedium), socketJoltTest, 0 );
epicsThreadSleep ( 1.0 );
assert ( ! wakeup );
epicsSignalRaiseSigAlarm ( id );
epicsThreadSleep ( 1.0 );
char * pStr = "esscimqi_?????";
if ( wakeup ) {
pStr = "esscimqi_socketSigAlarmRequired";
}
else {
status = shutdown ( s, SHUT_RDWR );
assert ( status == 0 );
epicsThreadSleep ( 1.0 );
if ( wakeup ) {
pStr = "esscimqi_socketBothShutdownRequired";
}
else {
epicsSocketDestroy ( s );
epicsThreadSleep ( 1.0 );
if ( wakeup ) {
pStr = "esscimqi_socketCloseRequired";
}
else {
pStr = "esscimqi_?????";
}
}
}
printf ( "Local os behaves like \"%s\"\n", pStr );
pStr = "esscimqi_?????";
switch ( epicsSocketSystemCallInterruptMechanismQuery() ) {
case esscimqi_socketCloseRequired:
pStr = "esscimqi_socketCloseRequired";
break;
case esscimqi_socketBothShutdownRequired:
pStr = "esscimqi_socketBothShutdownRequired";
break;
case esscimqi_socketSigAlarmRequired:
pStr = "esscimqi_socketSigAlarmRequired";
break;
}
printf ( "epicsSocketSystemCallInterruptMechanismQuery() returns\n\"%s\"\n",
pStr );
}