You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
1.6KB

  1. /***************************************************/
  2. /*! \class Socket
  3. \brief STK internet socket abstract base class.
  4. This class provides common functionality for TCP and UDP internet
  5. socket server and client subclasses.
  6. by Perry R. Cook and Gary P. Scavone, 1995--2017.
  7. */
  8. /***************************************************/
  9. #include "Socket.h"
  10. namespace stk {
  11. Socket :: Socket()
  12. {
  13. soket_ = -1;
  14. port_ = -1;
  15. }
  16. Socket :: ~Socket()
  17. {
  18. this->close( soket_ );
  19. #if defined(__OS_WINDOWS__)
  20. WSACleanup();
  21. #endif
  22. }
  23. void Socket :: close( int socket )
  24. {
  25. if ( !isValid( socket ) ) return;
  26. #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
  27. ::close( socket );
  28. #elif defined(__OS_WINDOWS__)
  29. ::closesocket( socket );
  30. #endif
  31. }
  32. void Socket :: setBlocking( int socket, bool enable )
  33. {
  34. if ( !isValid( socket ) ) return;
  35. #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
  36. int tmp = ::fcntl( socket, F_GETFL, 0 );
  37. if ( tmp >= 0 )
  38. tmp = ::fcntl( socket, F_SETFL, enable ? (tmp &~ O_NONBLOCK) : (tmp | O_NONBLOCK) );
  39. #elif defined(__OS_WINDOWS__)
  40. unsigned long non_block = !enable;
  41. ioctlsocket( socket, FIONBIO, &non_block );
  42. #endif
  43. }
  44. int Socket :: writeBuffer(int socket, const void *buffer, long bufferSize, int flags )
  45. {
  46. if ( !isValid( socket ) ) return -1;
  47. return send( socket, (const char *)buffer, bufferSize, flags );
  48. }
  49. int Socket :: readBuffer(int socket, void *buffer, long bufferSize, int flags )
  50. {
  51. if ( !isValid( socket ) ) return -1;
  52. return recv( socket, (char *)buffer, bufferSize, flags );
  53. }
  54. } // stk namespace