From 965a511c47df69874b5ac4c7b0c528a4e94d3527 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Wed, 12 May 2004 20:51:25 +0000 Subject: [PATCH] added socket unblock mechanism test --- src/libCom/test/Makefile | 8 +++ src/libCom/test/blockingSockTest.cpp | 82 ++++++++++++++++++++++++ src/libCom/test/blockingSockTestMain.cpp | 8 +++ 3 files changed, 98 insertions(+) create mode 100644 src/libCom/test/blockingSockTest.cpp create mode 100644 src/libCom/test/blockingSockTestMain.cpp diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index d746f9b38..d51e25aaf 100644 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -78,6 +78,14 @@ macEnvExpandTestHost_SRCS += macEnvExpandTestMain.cpp macEnvExpandTest.c PROD_HOST += macEnvExpandTestHost OBJS_IOC_vxWorks += macEnvExpandTest +blockingSockTestHost_SRCS += blockingSockTestMain.cpp blockingSockTest.cpp +PROD_HOST += blockingSockTestHost +OBJS_IOC_vxWorks += blockingSockTest +# needed when its an object library build +blockingSockTestHost_SYS_LIBS_WIN32 = ws2_32 advapi32 user32 +blockingSockTestHost_SYS_LIBS_solaris = socket + + #fdmgrTest_SRCS += fdmgrTest.c #PROD_HOST += fdmgrTest diff --git a/src/libCom/test/blockingSockTest.cpp b/src/libCom/test/blockingSockTest.cpp new file mode 100644 index 000000000..231dc8e7e --- /dev/null +++ b/src/libCom/test/blockingSockTest.cpp @@ -0,0 +1,82 @@ + +#include + +#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 ); +} diff --git a/src/libCom/test/blockingSockTestMain.cpp b/src/libCom/test/blockingSockTestMain.cpp new file mode 100644 index 000000000..0ce6cc3ed --- /dev/null +++ b/src/libCom/test/blockingSockTestMain.cpp @@ -0,0 +1,8 @@ + +void blockingSockTest (); + +int main () +{ + blockingSockTest (); + return 0; +} \ No newline at end of file