GroupsockHelper.hh 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**********
  2. This library is free software; you can redistribute it and/or modify it under
  3. the terms of the GNU Lesser General Public License as published by the
  4. Free Software Foundation; either version 3 of the License, or (at your
  5. option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
  6. This library is distributed in the hope that it will be useful, but WITHOUT
  7. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  8. FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
  9. more details.
  10. You should have received a copy of the GNU Lesser General Public License
  11. along with this library; if not, write to the Free Software Foundation, Inc.,
  12. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  13. **********/
  14. // "mTunnel" multicast access service
  15. // Copyright (c) 1996-2020 Live Networks, Inc. All rights reserved.
  16. // Helper routines to implement 'group sockets'
  17. // C++ header
  18. #ifndef _GROUPSOCK_HELPER_HH
  19. #define _GROUPSOCK_HELPER_HH
  20. #ifndef _NET_ADDRESS_HH
  21. #include "NetAddress.hh"
  22. #endif
  23. #define MAX_SOCKET_SEND_BUFFER_SIZE (500*1024) /* AX: enlarge the size */
  24. int setupDatagramSocket(UsageEnvironment& env, Port port);
  25. int setupStreamSocket(UsageEnvironment& env,
  26. Port port, Boolean makeNonBlocking = True, Boolean setKeepAlive = False);
  27. int readSocket(UsageEnvironment& env,
  28. int socket, unsigned char* buffer, unsigned bufferSize,
  29. struct sockaddr_in& fromAddress);
  30. Boolean writeSocket(UsageEnvironment& env,
  31. int socket, struct in_addr address, portNumBits portNum/*network byte order*/,
  32. u_int8_t ttlArg,
  33. unsigned char* buffer, unsigned bufferSize);
  34. Boolean writeSocket(UsageEnvironment& env,
  35. int socket, struct in_addr address, portNumBits portNum/*network byte order*/,
  36. unsigned char* buffer, unsigned bufferSize);
  37. // An optimized version of "writeSocket" that omits the "setsockopt()" call to set the TTL.
  38. void ignoreSigPipeOnSocket(int socketNum);
  39. unsigned getSendBufferSize(UsageEnvironment& env, int socket);
  40. unsigned getReceiveBufferSize(UsageEnvironment& env, int socket);
  41. unsigned setSendBufferTo(UsageEnvironment& env,
  42. int socket, unsigned requestedSize);
  43. unsigned setReceiveBufferTo(UsageEnvironment& env,
  44. int socket, unsigned requestedSize);
  45. unsigned increaseSendBufferTo(UsageEnvironment& env,
  46. int socket, unsigned requestedSize);
  47. unsigned increaseReceiveBufferTo(UsageEnvironment& env,
  48. int socket, unsigned requestedSize);
  49. Boolean makeSocketNonBlocking(int sock);
  50. Boolean makeSocketBlocking(int sock, unsigned writeTimeoutInMilliseconds = 0);
  51. // A "writeTimeoutInMilliseconds" value of 0 means: Don't timeout
  52. Boolean setSocketKeepAlive(int sock);
  53. Boolean socketJoinGroup(UsageEnvironment& env, int socket,
  54. netAddressBits groupAddress);
  55. Boolean socketLeaveGroup(UsageEnvironment&, int socket,
  56. netAddressBits groupAddress);
  57. // source-specific multicast join/leave
  58. Boolean socketJoinGroupSSM(UsageEnvironment& env, int socket,
  59. netAddressBits groupAddress,
  60. netAddressBits sourceFilterAddr);
  61. Boolean socketLeaveGroupSSM(UsageEnvironment&, int socket,
  62. netAddressBits groupAddress,
  63. netAddressBits sourceFilterAddr);
  64. Boolean getSourcePort(UsageEnvironment& env, int socket, Port& port);
  65. netAddressBits ourIPAddress(UsageEnvironment& env); // in network order
  66. // IP addresses of our sending and receiving interfaces. (By default, these
  67. // are INADDR_ANY (i.e., 0), specifying the default interface.)
  68. extern netAddressBits SendingInterfaceAddr;
  69. extern netAddressBits ReceivingInterfaceAddr;
  70. // Allocates a randomly-chosen IPv4 SSM (multicast) address:
  71. netAddressBits chooseRandomIPv4SSMAddress(UsageEnvironment& env);
  72. // Returns a simple "hh:mm:ss" string, for use in debugging output (e.g.)
  73. char const* timestampString();
  74. #ifdef HAVE_SOCKADDR_LEN
  75. #define SET_SOCKADDR_SIN_LEN(var) var.sin_len = sizeof var
  76. #else
  77. #define SET_SOCKADDR_SIN_LEN(var)
  78. #endif
  79. #define MAKE_SOCKADDR_IN(var,adr,prt) /*adr,prt must be in network order*/\
  80. struct sockaddr_in var;\
  81. var.sin_family = AF_INET;\
  82. var.sin_addr.s_addr = (adr);\
  83. var.sin_port = (prt);\
  84. SET_SOCKADDR_SIN_LEN(var);
  85. // By default, we create sockets with the SO_REUSE_* flag set.
  86. // If, instead, you want to create sockets without the SO_REUSE_* flags,
  87. // Then enclose the creation code with:
  88. // {
  89. // NoReuse dummy;
  90. // ...
  91. // }
  92. class NoReuse {
  93. public:
  94. NoReuse(UsageEnvironment& env);
  95. ~NoReuse();
  96. private:
  97. UsageEnvironment& fEnv;
  98. };
  99. // Define the "UsageEnvironment"-specific "groupsockPriv" structure:
  100. struct _groupsockPriv { // There should be only one of these allocated
  101. HashTable* socketTable;
  102. int reuseFlag;
  103. };
  104. _groupsockPriv* groupsockPriv(UsageEnvironment& env); // allocates it if necessary
  105. void reclaimGroupsockPriv(UsageEnvironment& env);
  106. #if (defined(__WIN32__) || defined(_WIN32)) && !defined(__MINGW32__)
  107. // For Windoze, we need to implement our own gettimeofday()
  108. extern int gettimeofday(struct timeval*, int*);
  109. #else
  110. #include <sys/time.h>
  111. #endif
  112. // The following are implemented in inet.c:
  113. extern "C" netAddressBits our_inet_addr(char const*);
  114. extern "C" void our_srandom(int x);
  115. extern "C" long our_random();
  116. extern "C" u_int32_t our_random32(); // because "our_random()" returns a 31-bit number
  117. #endif