#include "NetAddress.hh"Include dependency graph for GroupsockHelper.hh:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
| #define MAKE_SOCKADDR_IN | ( | var, | |||
| adr, | |||||
| prt | ) |
Value:
/*adr,prt must be in network order*/\ struct sockaddr_in var;\ var.sin_family = AF_INET;\ var.sin_addr.s_addr = (adr);\ var.sin_port = (prt);\ SET_SOCKADDR_SIN_LEN(var);
Definition at line 90 of file GroupsockHelper.hh.
Referenced by RTSPClient::connectToServer(), MP3HTTPSource::createNew(), getSourcePort(), setupDatagramSocket(), setupStreamSocket(), and writeSocket().
| #define SET_SOCKADDR_SIN_LEN | ( | var | ) |
Definition at line 87 of file GroupsockHelper.hh.
| netAddressBits chooseRandomIPv4SSMAddress | ( | UsageEnvironment & | env | ) |
Definition at line 644 of file GroupsockHelper.cpp.
References env, our_random(), and ourIPAddress().
Referenced by main().
00644 { 00645 // First, a hack to ensure that our random number generator is seeded: 00646 (void) ourIPAddress(env); 00647 00648 // Choose a random address in the range [232.0.1.0, 232.255.255.255) 00649 // i.e., [0xE8000100, 0xE8FFFFFF) 00650 netAddressBits const first = 0xE8000100, lastPlus1 = 0xE8FFFFFF; 00651 netAddressBits const range = lastPlus1 - first; 00652 00653 return ntohl(first + ((netAddressBits)our_random())%range); 00654 }
| unsigned getReceiveBufferSize | ( | UsageEnvironment & | env, | |
| int | socket | |||
| ) |
Definition at line 351 of file GroupsockHelper.cpp.
References env, and getBufferSize().
Referenced by continueAfterDESCRIBE().
00351 { 00352 return getBufferSize(env, SO_RCVBUF, socket); 00353 }
| unsigned getSendBufferSize | ( | UsageEnvironment & | env, | |
| int | socket | |||
| ) |
Definition at line 348 of file GroupsockHelper.cpp.
References env, and getBufferSize().
00348 { 00349 return getBufferSize(env, SO_SNDBUF, socket); 00350 }
| Boolean getSourcePort | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| Port & | port | |||
| ) |
Definition at line 507 of file GroupsockHelper.cpp.
References env, False, getSourcePort0(), MAKE_SOCKADDR_IN, socketErr(), and True.
Referenced by MediaSubsession::initiate(), RTSPServer::setUpOurSocket(), SIPClient::SIPClient(), and OutputSocket::write().
00507 { 00508 portNumBits portNum = 0; 00509 if (!getSourcePort0(socket, portNum) || portNum == 0) { 00510 // Hack - call bind(), then try again: 00511 MAKE_SOCKADDR_IN(name, INADDR_ANY, 0); 00512 bind(socket, (struct sockaddr*)&name, sizeof name); 00513 00514 if (!getSourcePort0(socket, portNum) || portNum == 0) { 00515 socketErr(env, "getsockname() error: "); 00516 return False; 00517 } 00518 } 00519 00520 port = Port(portNum); 00521 return True; 00522 }
| _groupsockPriv* groupsockPriv | ( | UsageEnvironment & | env | ) |
Definition at line 53 of file GroupsockHelper.cpp.
References env, UsageEnvironment::groupsockPriv, NULL, _groupsockPriv::reuseFlag, and _groupsockPriv::socketTable.
Referenced by getSocketTable(), NoReuse::NoReuse(), setupDatagramSocket(), setupStreamSocket(), and NoReuse::~NoReuse().
00053 { 00054 if (env.groupsockPriv == NULL) { // We need to create it 00055 _groupsockPriv* result = new _groupsockPriv; 00056 result->socketTable = NULL; 00057 result->reuseFlag = 1; // default value => allow reuse of socket numbers 00058 env.groupsockPriv = result; 00059 } 00060 return (_groupsockPriv*)(env.groupsockPriv); 00061 }
| unsigned increaseReceiveBufferTo | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| unsigned | requestedSize | |||
| ) |
Definition at line 396 of file GroupsockHelper.cpp.
References env, and increaseBufferTo().
Referenced by BasicUDPSource::BasicUDPSource(), MP3HTTPSource::createNew(), MediaSubsession::initiate(), and MultiFramedRTPSource::MultiFramedRTPSource().
00397 { 00398 return increaseBufferTo(env, SO_RCVBUF, socket, requestedSize); 00399 }
| unsigned increaseSendBufferTo | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| unsigned | requestedSize | |||
| ) |
Definition at line 392 of file GroupsockHelper.cpp.
References env, and increaseBufferTo().
Referenced by OnDemandServerMediaSubsession::getStreamParameters(), RTSPServer::incomingConnectionHandler(), RTPInterface::RTPInterface(), DarwinInjector::setDestination(), RTSPServer::setUpOurSocket(), and PassiveServerMediaSubsession::startStream().
00393 { 00394 return increaseBufferTo(env, SO_SNDBUF, socket, requestedSize); 00395 }
| Boolean makeSocketBlocking | ( | int | sock | ) |
Definition at line 184 of file GroupsockHelper.cpp.
00184 { 00185 #if defined(__WIN32__) || defined(_WIN32) 00186 unsigned long arg = 0; 00187 return ioctlsocket(sock, FIONBIO, &arg) == 0; 00188 #elif defined(VXWORKS) 00189 int arg = 0; 00190 return ioctl(sock, FIONBIO, (int)&arg) == 0; 00191 #else 00192 int curFlags = fcntl(sock, F_GETFL, 0); 00193 return fcntl(sock, F_SETFL, curFlags&(~O_NONBLOCK)) >= 0; 00194 #endif 00195 }
| Boolean makeSocketNonBlocking | ( | int | sock | ) |
Definition at line 171 of file GroupsockHelper.cpp.
Referenced by BasicUDPSource::BasicUDPSource(), ByteStreamFileSource::ByteStreamFileSource(), RTSPServer::incomingConnectionHandler(), RTPInterface::RTPInterface(), and setupStreamSocket().
00171 { 00172 #if defined(__WIN32__) || defined(_WIN32) 00173 unsigned long arg = 1; 00174 return ioctlsocket(sock, FIONBIO, &arg) == 0; 00175 #elif defined(VXWORKS) 00176 int arg = 1; 00177 return ioctl(sock, FIONBIO, (int)&arg) == 0; 00178 #else 00179 int curFlags = fcntl(sock, F_GETFL, 0); 00180 return fcntl(sock, F_SETFL, curFlags|O_NONBLOCK) >= 0; 00181 #endif 00182 }
| netAddressBits our_inet_addr | ( | char const * | ) |
Definition at line 15 of file inet.c.
Referenced by MPEG2TransportUDPServerMediaSubsession::createNewStreamSource(), RTSPServer::RTSPClientSession::handleCmd_SETUP(), main(), NetAddressList::NetAddressList(), ourIPAddress(), and startReplicaUDPSink().
| long our_random | ( | ) |
Definition at line 388 of file inet.c.
References DEG_3, SEP_3, and TYPE_0.
Referenced by FileSink::addData(), chooseRandomIPv4SSMAddress(), MP3ADUdeinterleaver::doGetNextFrame(), MP3FromADUSource::doGetNextFrame(), drand30(), MediaSession::MediaSession(), MultiFramedRTPSource::networkReadHandler1(), our_random32(), our_srandom(), and MultiFramedRTPSink::sendPacketIfNecessary().
00388 { 00389 long i; 00390 00391 if (rand_type == TYPE_0) { 00392 i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff; 00393 } else { 00394 /* Make copies of "rptr" and "fptr" before working with them, in case we're being called concurrently by multiple threads: */ 00395 long* rp = rptr; 00396 long* fp = fptr; 00397 00398 /* Make sure "rp" and "fp" are separated by the correct distance (again, allowing for concurrent access): */ 00399 if (!(fp == rp+SEP_3 || fp+DEG_3 == rp+SEP_3)) { 00400 /* A rare case that should occur only if we're being called concurrently by multiple threads. */ 00401 /* Restore the proper separation between the pointers: */ 00402 if (rp <= fp) rp = fp-SEP_3; else rp = fp+DEG_3-SEP_3; 00403 } 00404 00405 *fp += *rp; 00406 i = (*fp >> 1) & 0x7fffffff; /* chucking least random bit */ 00407 if (++fp >= end_ptr) { 00408 fp = state; 00409 ++rp; 00410 } else if (++rp >= end_ptr) { 00411 rp = state; 00412 } 00413 00414 /* Restore "rptr" and "fptr" from our working copies: */ 00415 rptr = rp; 00416 fptr = fp; 00417 } 00418 00419 return i; 00420 }
| u_int32_t our_random32 | ( | ) |
Definition at line 423 of file inet.c.
References our_random().
Referenced by RTSPServer::incomingConnectionHandler(), SIPClient::invite(), and DarwinInjector::setDestination().
00423 { 00424 /* Return a 32-bit random number. 00425 Because "our_random()" returns a 31-bit random number, we call it a second 00426 time, to generate the high bit. 00427 (Actually, to increase the likelhood of randomness, we take the middle 16 bits of two successive calls to "our_random()") 00428 */ 00429 long random_1 = our_random(); 00430 u_int32_t random16_1 = (u_int32_t)(random_1&0x00FFFF00); 00431 00432 long random_2 = our_random(); 00433 u_int32_t random16_2 = (u_int32_t)(random_2&0x00FFFF00); 00434 00435 return (random16_1<<8) | (random16_2>>8); 00436 }
| void our_srandom | ( | int | x | ) |
Referenced by our_initstate(), and ourIPAddress().
| netAddressBits ourIPAddress | ( | UsageEnvironment & | env | ) |
Definition at line 534 of file GroupsockHelper.cpp.
References badAddressForUs(), closeSocket, NetAddress::data(), env, iter, loopbackWorks, NULL, our_inet_addr(), our_srandom(), readSocket(), UsageEnvironment::setResultErrMsg(), UsageEnvironment::setResultMsg(), setupDatagramSocket(), socketJoinGroup(), socketLeaveGroup(), and writeSocket().
Referenced by chooseRandomIPv4SSMAddress(), ServerMediaSession::generateSDPDescription(), Groupsock::Groupsock(), Groupsock::output(), RTSPServer::rtspURLPrefix(), SIPClient::SIPClient(), and Groupsock::wasLoopedBackFromUs().
00534 { 00535 static netAddressBits ourAddress = 0; 00536 int sock = -1; 00537 struct in_addr testAddr; 00538 00539 if (ourAddress == 0) { 00540 // We need to find our source address 00541 struct sockaddr_in fromAddr; 00542 fromAddr.sin_addr.s_addr = 0; 00543 00544 // Get our address by sending a (0-TTL) multicast packet, 00545 // receiving it, and looking at the source address used. 00546 // (This is kinda bogus, but it provides the best guarantee 00547 // that other nodes will think our address is the same as we do.) 00548 do { 00549 loopbackWorks = 0; // until we learn otherwise 00550 00551 testAddr.s_addr = our_inet_addr("228.67.43.91"); // arbitrary 00552 Port testPort(15947); // ditto 00553 00554 sock = setupDatagramSocket(env, testPort); 00555 if (sock < 0) break; 00556 00557 if (!socketJoinGroup(env, sock, testAddr.s_addr)) break; 00558 00559 unsigned char testString[] = "hostIdTest"; 00560 unsigned testStringLength = sizeof testString; 00561 00562 if (!writeSocket(env, sock, testAddr, testPort, 0, 00563 testString, testStringLength)) break; 00564 00565 // Block until the socket is readable (with a 5-second timeout): 00566 fd_set rd_set; 00567 FD_ZERO(&rd_set); 00568 FD_SET((unsigned)sock, &rd_set); 00569 const unsigned numFds = sock+1; 00570 struct timeval timeout; 00571 timeout.tv_sec = 5; 00572 timeout.tv_usec = 0; 00573 int result = select(numFds, &rd_set, NULL, NULL, &timeout); 00574 if (result <= 0) break; 00575 00576 unsigned char readBuffer[20]; 00577 int bytesRead = readSocket(env, sock, 00578 readBuffer, sizeof readBuffer, 00579 fromAddr); 00580 if (bytesRead != (int)testStringLength 00581 || strncmp((char*)readBuffer, (char*)testString, testStringLength) != 0) { 00582 break; 00583 } 00584 00585 loopbackWorks = 1; 00586 } while (0); 00587 00588 if (sock >= 0) { 00589 socketLeaveGroup(env, sock, testAddr.s_addr); 00590 closeSocket(sock); 00591 } 00592 00593 if (!loopbackWorks) do { 00594 // We couldn't find our address using multicast loopback, 00595 // so try instead to look it up directly - by first getting our host name, and then resolving this host name 00596 char hostname[100]; 00597 hostname[0] = '\0'; 00598 int result = gethostname(hostname, sizeof hostname); 00599 if (result != 0 || hostname[0] == '\0') { 00600 env.setResultErrMsg("initial gethostname() failed"); 00601 break; 00602 } 00603 00604 // Try to resolve "hostname" to an IP address: 00605 NetAddressList addresses(hostname); 00606 NetAddressList::Iterator iter(addresses); 00607 NetAddress const* address; 00608 00609 // Take the first address that's not bad: 00610 netAddressBits addr = 0; 00611 while ((address = iter.nextAddress()) != NULL) { 00612 netAddressBits a = *(netAddressBits*)(address->data()); 00613 if (!badAddressForUs(a)) { 00614 addr = a; 00615 break; 00616 } 00617 } 00618 00619 // Assign the address that we found to "fromAddr" (as if the 'loopback' method had worked), to simplify the code below: 00620 fromAddr.sin_addr.s_addr = addr; 00621 } while (0); 00622 00623 // Make sure we have a good address: 00624 netAddressBits from = fromAddr.sin_addr.s_addr; 00625 if (badAddressForUs(from)) { 00626 char tmp[100]; 00627 sprintf(tmp, "This computer has an invalid IP address: %s", AddressString(from).val()); 00628 env.setResultMsg(tmp); 00629 from = 0; 00630 } 00631 00632 ourAddress = from; 00633 00634 // Use our newly-discovered IP address, and the current time, 00635 // to initialize the random number generator's seed: 00636 struct timeval timeNow; 00637 gettimeofday(&timeNow, NULL); 00638 unsigned seed = ourAddress^timeNow.tv_sec^timeNow.tv_usec; 00639 our_srandom(seed); 00640 } 00641 return ourAddress; 00642 }
| int readSocket | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| unsigned char * | buffer, | |||
| unsigned | bufferSize, | |||
| struct sockaddr_in & | fromAddress | |||
| ) |
Definition at line 267 of file GroupsockHelper.cpp.
References env, UsageEnvironment::getErrno(), socketErr(), and SOCKLEN_T.
Referenced by Groupsock::handleRead(), RTPInterface::handleRead(), RTSPClient::incomingDataHandler1(), RTSPServer::RTSPClientSession::incomingRequestHandler1(), ourIPAddress(), and SocketDescriptor::tcpReadHandler1().
00269 { 00270 SOCKLEN_T addressSize = sizeof fromAddress; 00271 int bytesRead = recvfrom(socket, (char*)buffer, bufferSize, 0, 00272 (struct sockaddr*)&fromAddress, 00273 &addressSize); 00274 if (bytesRead < 0) { 00275 //##### HACK to work around bugs in Linux and Windows: 00276 int err = env.getErrno(); 00277 if (err == 111 /*ECONNREFUSED (Linux)*/ 00278 #if defined(__WIN32__) || defined(_WIN32) 00279 // What a piece of crap Windows is. Sometimes 00280 // recvfrom() returns -1, but with an 'errno' of 0. 00281 // This appears not to be a real error; just treat 00282 // it as if it were a read of zero bytes, and hope 00283 // we don't have to do anything else to 'reset' 00284 // this alleged error: 00285 || err == 0 || err == EWOULDBLOCK 00286 #else 00287 || err == EAGAIN 00288 #endif 00289 || err == 113 /*EHOSTUNREACH (Linux)*/) { // Why does Linux return this for datagram sock? 00290 fromAddress.sin_addr.s_addr = 0; 00291 return 0; 00292 } 00293 //##### END HACK 00294 socketErr(env, "recvfrom() error: "); 00295 } 00296 00297 return bytesRead; 00298 }
| void reclaimGroupsockPriv | ( | UsageEnvironment & | env | ) |
Definition at line 63 of file GroupsockHelper.cpp.
References env, UsageEnvironment::groupsockPriv, NULL, _groupsockPriv::reuseFlag, and _groupsockPriv::socketTable.
Referenced by setupDatagramSocket(), setupStreamSocket(), unsetGroupsockBySocket(), and NoReuse::~NoReuse().
00063 { 00064 _groupsockPriv* priv = (_groupsockPriv*)(env.groupsockPriv); 00065 if (priv->socketTable == NULL && priv->reuseFlag == 1/*default value*/) { 00066 // We can delete the structure (to save space); it will get created again, if needed: 00067 delete priv; 00068 env.groupsockPriv = NULL; 00069 } 00070 }
| unsigned setReceiveBufferTo | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| unsigned | requestedSize | |||
| ) |
Definition at line 367 of file GroupsockHelper.cpp.
References env, and setBufferTo().
Referenced by continueAfterDESCRIBE().
00368 { 00369 return setBufferTo(env, SO_RCVBUF, socket, requestedSize); 00370 }
| unsigned setSendBufferTo | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| unsigned | requestedSize | |||
| ) |
Definition at line 363 of file GroupsockHelper.cpp.
References env, and setBufferTo().
00364 { 00365 return setBufferTo(env, SO_SNDBUF, socket, requestedSize); 00366 }
| int setupDatagramSocket | ( | UsageEnvironment & | env, | |
| Port | port | |||
| ) |
Definition at line 90 of file GroupsockHelper.cpp.
References closeSocket, createSocket(), env, groupsockPriv(), initializeWinsockIfNecessary, MAKE_SOCKADDR_IN, Port::num(), ReceivingInterfaceAddr, reclaimGroupsockPriv(), _groupsockPriv::reuseFlag, SendingInterfaceAddr, and socketErr().
Referenced by Socket::changePort(), ourIPAddress(), and Socket::Socket().
00090 { 00091 if (!initializeWinsockIfNecessary()) { 00092 socketErr(env, "Failed to initialize 'winsock': "); 00093 return -1; 00094 } 00095 00096 int newSocket = createSocket(SOCK_DGRAM); 00097 if (newSocket < 0) { 00098 socketErr(env, "unable to create datagram socket: "); 00099 return newSocket; 00100 } 00101 00102 int reuseFlag = groupsockPriv(env)->reuseFlag; 00103 reclaimGroupsockPriv(env); 00104 if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR, 00105 (const char*)&reuseFlag, sizeof reuseFlag) < 0) { 00106 socketErr(env, "setsockopt(SO_REUSEADDR) error: "); 00107 closeSocket(newSocket); 00108 return -1; 00109 } 00110 00111 #if defined(__WIN32__) || defined(_WIN32) 00112 // Windoze doesn't properly handle SO_REUSEPORT or IP_MULTICAST_LOOP 00113 #else 00114 #ifdef SO_REUSEPORT 00115 if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT, 00116 (const char*)&reuseFlag, sizeof reuseFlag) < 0) { 00117 socketErr(env, "setsockopt(SO_REUSEPORT) error: "); 00118 closeSocket(newSocket); 00119 return -1; 00120 } 00121 #endif 00122 00123 #ifdef IP_MULTICAST_LOOP 00124 const u_int8_t loop = 1; 00125 if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_LOOP, 00126 (const char*)&loop, sizeof loop) < 0) { 00127 socketErr(env, "setsockopt(IP_MULTICAST_LOOP) error: "); 00128 closeSocket(newSocket); 00129 return -1; 00130 } 00131 #endif 00132 #endif 00133 00134 // Note: Windoze requires binding, even if the port number is 0 00135 netAddressBits addr = INADDR_ANY; 00136 #if defined(__WIN32__) || defined(_WIN32) 00137 #else 00138 if (port.num() != 0 || ReceivingInterfaceAddr != INADDR_ANY) { 00139 #endif 00140 if (port.num() == 0) addr = ReceivingInterfaceAddr; 00141 MAKE_SOCKADDR_IN(name, addr, port.num()); 00142 if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) { 00143 char tmpBuffer[100]; 00144 sprintf(tmpBuffer, "bind() error (port number: %d): ", 00145 ntohs(port.num())); 00146 socketErr(env, tmpBuffer); 00147 closeSocket(newSocket); 00148 return -1; 00149 } 00150 #if defined(__WIN32__) || defined(_WIN32) 00151 #else 00152 } 00153 #endif 00154 00155 // Set the sending interface for multicasts, if it's not the default: 00156 if (SendingInterfaceAddr != INADDR_ANY) { 00157 struct in_addr addr; 00158 addr.s_addr = SendingInterfaceAddr; 00159 00160 if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_IF, 00161 (const char*)&addr, sizeof addr) < 0) { 00162 socketErr(env, "error setting outgoing multicast interface: "); 00163 closeSocket(newSocket); 00164 return -1; 00165 } 00166 } 00167 00168 return newSocket; 00169 }
| int setupStreamSocket | ( | UsageEnvironment & | env, | |
| Port | port, | |||
| Boolean | makeNonBlocking = True | |||
| ) |
Definition at line 197 of file GroupsockHelper.cpp.
References closeSocket, createSocket(), env, groupsockPriv(), initializeWinsockIfNecessary, MAKE_SOCKADDR_IN, makeSocketNonBlocking(), Port::num(), ReceivingInterfaceAddr, reclaimGroupsockPriv(), _groupsockPriv::reuseFlag, and socketErr().
Referenced by MP3HTTPSource::createNew(), RTSPClient::openConnection(), RTSPClient::responseHandlerForHTTP_GET1(), and RTSPServer::setUpOurSocket().
00198 { 00199 if (!initializeWinsockIfNecessary()) { 00200 socketErr(env, "Failed to initialize 'winsock': "); 00201 return -1; 00202 } 00203 00204 int newSocket = createSocket(SOCK_STREAM); 00205 if (newSocket < 0) { 00206 socketErr(env, "unable to create stream socket: "); 00207 return newSocket; 00208 } 00209 00210 int reuseFlag = groupsockPriv(env)->reuseFlag; 00211 reclaimGroupsockPriv(env); 00212 if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR, 00213 (const char*)&reuseFlag, sizeof reuseFlag) < 0) { 00214 socketErr(env, "setsockopt(SO_REUSEADDR) error: "); 00215 closeSocket(newSocket); 00216 return -1; 00217 } 00218 00219 // SO_REUSEPORT doesn't really make sense for TCP sockets, so we 00220 // normally don't set them. However, if you really want to do this 00221 // #define REUSE_FOR_TCP 00222 #ifdef REUSE_FOR_TCP 00223 #if defined(__WIN32__) || defined(_WIN32) 00224 // Windoze doesn't properly handle SO_REUSEPORT 00225 #else 00226 #ifdef SO_REUSEPORT 00227 if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT, 00228 (const char*)&reuseFlag, sizeof reuseFlag) < 0) { 00229 socketErr(env, "setsockopt(SO_REUSEPORT) error: "); 00230 closeSocket(newSocket); 00231 return -1; 00232 } 00233 #endif 00234 #endif 00235 #endif 00236 00237 // Note: Windoze requires binding, even if the port number is 0 00238 #if defined(__WIN32__) || defined(_WIN32) 00239 #else 00240 if (port.num() != 0 || ReceivingInterfaceAddr != INADDR_ANY) { 00241 #endif 00242 MAKE_SOCKADDR_IN(name, ReceivingInterfaceAddr, port.num()); 00243 if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) { 00244 char tmpBuffer[100]; 00245 sprintf(tmpBuffer, "bind() error (port number: %d): ", 00246 ntohs(port.num())); 00247 socketErr(env, tmpBuffer); 00248 closeSocket(newSocket); 00249 return -1; 00250 } 00251 #if defined(__WIN32__) || defined(_WIN32) 00252 #else 00253 } 00254 #endif 00255 00256 if (makeNonBlocking) { 00257 if (!makeSocketNonBlocking(newSocket)) { 00258 socketErr(env, "failed to make non-blocking: "); 00259 closeSocket(newSocket); 00260 return -1; 00261 } 00262 } 00263 00264 return newSocket; 00265 }
| Boolean socketJoinGroup | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| netAddressBits | groupAddress | |||
| ) |
Definition at line 401 of file GroupsockHelper.cpp.
References env, False, UsageEnvironment::getErrno(), IsMulticastAddress(), ReceivingInterfaceAddr, socketErr(), and True.
Referenced by Groupsock::changeDestinationParameters(), Groupsock::Groupsock(), and ourIPAddress().
00402 { 00403 if (!IsMulticastAddress(groupAddress)) return True; // ignore this case 00404 00405 struct ip_mreq imr; 00406 imr.imr_multiaddr.s_addr = groupAddress; 00407 imr.imr_interface.s_addr = ReceivingInterfaceAddr; 00408 if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, 00409 (const char*)&imr, sizeof (struct ip_mreq)) < 0) { 00410 #if defined(__WIN32__) || defined(_WIN32) 00411 if (env.getErrno() != 0) { 00412 // That piece-of-shit toy operating system (Windows) sometimes lies 00413 // about setsockopt() failing! 00414 #endif 00415 socketErr(env, "setsockopt(IP_ADD_MEMBERSHIP) error: "); 00416 return False; 00417 #if defined(__WIN32__) || defined(_WIN32) 00418 } 00419 #endif 00420 } 00421 00422 return True; 00423 }
| Boolean socketJoinGroupSSM | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| netAddressBits | groupAddress, | |||
| netAddressBits | sourceFilterAddr | |||
| ) |
Definition at line 463 of file GroupsockHelper.cpp.
References env, False, ip_mreq_source::imr_interface, ip_mreq_source::imr_multiaddr, ip_mreq_source::imr_sourceaddr, IP_ADD_SOURCE_MEMBERSHIP, IsMulticastAddress(), ReceivingInterfaceAddr, socketErr(), and True.
Referenced by Groupsock::Groupsock().
00465 { 00466 if (!IsMulticastAddress(groupAddress)) return True; // ignore this case 00467 00468 struct ip_mreq_source imr; 00469 imr.imr_multiaddr.s_addr = groupAddress; 00470 imr.imr_sourceaddr.s_addr = sourceFilterAddr; 00471 imr.imr_interface.s_addr = ReceivingInterfaceAddr; 00472 if (setsockopt(socket, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, 00473 (const char*)&imr, sizeof (struct ip_mreq_source)) < 0) { 00474 socketErr(env, "setsockopt(IP_ADD_SOURCE_MEMBERSHIP) error: "); 00475 return False; 00476 } 00477 00478 return True; 00479 }
| Boolean socketLeaveGroup | ( | UsageEnvironment & | , | |
| int | socket, | |||
| netAddressBits | groupAddress | |||
| ) |
Definition at line 425 of file GroupsockHelper.cpp.
References False, IsMulticastAddress(), ReceivingInterfaceAddr, and True.
Referenced by Groupsock::changeDestinationParameters(), Groupsock::multicastSendOnly(), ourIPAddress(), and Groupsock::~Groupsock().
00426 { 00427 if (!IsMulticastAddress(groupAddress)) return True; // ignore this case 00428 00429 struct ip_mreq imr; 00430 imr.imr_multiaddr.s_addr = groupAddress; 00431 imr.imr_interface.s_addr = ReceivingInterfaceAddr; 00432 if (setsockopt(socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, 00433 (const char*)&imr, sizeof (struct ip_mreq)) < 0) { 00434 return False; 00435 } 00436 00437 return True; 00438 }
| Boolean socketLeaveGroupSSM | ( | UsageEnvironment & | , | |
| int | socket, | |||
| netAddressBits | groupAddress, | |||
| netAddressBits | sourceFilterAddr | |||
| ) |
Definition at line 481 of file GroupsockHelper.cpp.
References False, ip_mreq_source::imr_interface, ip_mreq_source::imr_multiaddr, ip_mreq_source::imr_sourceaddr, IP_DROP_SOURCE_MEMBERSHIP, IsMulticastAddress(), ReceivingInterfaceAddr, and True.
Referenced by Groupsock::~Groupsock().
00483 { 00484 if (!IsMulticastAddress(groupAddress)) return True; // ignore this case 00485 00486 struct ip_mreq_source imr; 00487 imr.imr_multiaddr.s_addr = groupAddress; 00488 imr.imr_sourceaddr.s_addr = sourceFilterAddr; 00489 imr.imr_interface.s_addr = ReceivingInterfaceAddr; 00490 if (setsockopt(socket, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, 00491 (const char*)&imr, sizeof (struct ip_mreq_source)) < 0) { 00492 return False; 00493 } 00494 00495 return True; 00496 }
| char const* timestampString | ( | ) |
Definition at line 656 of file GroupsockHelper.cpp.
References NULL.
Referenced by operator<<().
00656 { 00657 struct timeval tvNow; 00658 gettimeofday(&tvNow, NULL); 00659 00660 #if !defined(_WIN32_WCE) 00661 static char timeString[9]; // holds hh:mm:ss plus trailing '\0' 00662 char const* ctimeResult = ctime((time_t*)&tvNow.tv_sec); 00663 if (ctimeResult == NULL) { 00664 sprintf(timeString, "??:??:??"); 00665 } else { 00666 char const* from = &ctimeResult[11]; 00667 int i; 00668 for (i = 0; i < 8; ++i) { 00669 timeString[i] = from[i]; 00670 } 00671 timeString[i] = '\0'; 00672 } 00673 #else 00674 // WinCE apparently doesn't have "ctime()", so instead, construct 00675 // a timestamp string just using the integer and fractional parts 00676 // of "tvNow": 00677 static char timeString[50]; 00678 sprintf(timeString, "%lu.%06ld", tvNow.tv_sec, tvNow.tv_usec); 00679 #endif 00680 00681 return (char const*)&timeString; 00682 }
| Boolean writeSocket | ( | UsageEnvironment & | env, | |
| int | socket, | |||
| struct in_addr | address, | |||
| Port | port, | |||
| u_int8_t | ttlArg, | |||
| unsigned char * | buffer, | |||
| unsigned | bufferSize | |||
| ) |
Definition at line 300 of file GroupsockHelper.cpp.
References env, False, MAKE_SOCKADDR_IN, Port::num(), socketErr(), True, and TTL_TYPE.
Referenced by ourIPAddress(), and OutputSocket::write().
00303 { 00304 do { 00305 if (ttlArg != 0) { 00306 // Before sending, set the socket's TTL: 00307 #if defined(__WIN32__) || defined(_WIN32) 00308 #define TTL_TYPE int 00309 #else 00310 #define TTL_TYPE u_int8_t 00311 #endif 00312 TTL_TYPE ttl = (TTL_TYPE)ttlArg; 00313 if (setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, 00314 (const char*)&ttl, sizeof ttl) < 0) { 00315 socketErr(env, "setsockopt(IP_MULTICAST_TTL) error: "); 00316 break; 00317 } 00318 } 00319 00320 MAKE_SOCKADDR_IN(dest, address.s_addr, port.num()); 00321 int bytesSent = sendto(socket, (char*)buffer, bufferSize, 0, 00322 (struct sockaddr*)&dest, sizeof dest); 00323 if (bytesSent != (int)bufferSize) { 00324 char tmpBuf[100]; 00325 sprintf(tmpBuf, "writeSocket(%d), sendTo() error: wrote %d bytes instead of %u: ", socket, bytesSent, bufferSize); 00326 socketErr(env, tmpBuf); 00327 break; 00328 } 00329 00330 return True; 00331 } while (0); 00332 00333 return False; 00334 }
Definition at line 36 of file GroupsockHelper.cpp.
Referenced by RTSPServer::RTSPClientSession::handleCmd_SETUP(), main(), RTSPServer::rtspURLPrefix(), setupDatagramSocket(), setupStreamSocket(), socketJoinGroup(), socketJoinGroupSSM(), socketLeaveGroup(), and socketLeaveGroupSSM().
Definition at line 35 of file GroupsockHelper.cpp.
Referenced by RTSPServer::RTSPClientSession::handleCmd_SETUP(), and setupDatagramSocket().
1.5.2