diff options
Diffstat (limited to 'cpp/src/Ice/UdpTransceiver.cpp')
-rw-r--r-- | cpp/src/Ice/UdpTransceiver.cpp | 460 |
1 files changed, 230 insertions, 230 deletions
diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp index f7e26883e38..4853d98aaa9 100644 --- a/cpp/src/Ice/UdpTransceiver.cpp +++ b/cpp/src/Ice/UdpTransceiver.cpp @@ -33,8 +33,8 @@ IceInternal::UdpTransceiver::close() { if(_traceLevels->network >= 1) { - Trace out(_logger, _traceLevels->networkCat); - out << "closing udp connection\n" << toString(); + Trace out(_logger, _traceLevels->networkCat); + out << "closing udp connection\n" << toString(); } assert(_fd != INVALID_SOCKET); @@ -52,8 +52,8 @@ IceInternal::UdpTransceiver::shutdownReadWrite() { if(_traceLevels->network >= 2) { - Trace out(_logger, _traceLevels->networkCat); - out << "shutting down udp connection for reading and writing\n" << toString(); + Trace out(_logger, _traceLevels->networkCat); + out << "shutting down udp connection for reading and writing\n" << toString(); } // @@ -84,10 +84,10 @@ IceInternal::UdpTransceiver::shutdownReadWrite() // if(!_connect) { - struct sockaddr_in unspec; - memset(&unspec, 0, sizeof(unspec)); - unspec.sin_family = AF_UNSPEC; - ::connect(_fd, reinterpret_cast<struct sockaddr*>(&unspec), int(sizeof(unspec))); + struct sockaddr_in unspec; + memset(&unspec, 0, sizeof(unspec)); + unspec.sin_family = AF_UNSPEC; + ::connect(_fd, reinterpret_cast<struct sockaddr*>(&unspec), int(sizeof(unspec))); } // @@ -117,10 +117,10 @@ IceInternal::UdpTransceiver::write(Buffer& buf, int) const int packetSize = min(_maxPacketSize, _sndSize - _udpOverhead); if(packetSize < static_cast<int>(buf.b.size())) { - // - // We don't log a warning here because the client gets an exception anyway. - // - throw DatagramLimitException(__FILE__, __LINE__); + // + // We don't log a warning here because the client gets an exception anyway. + // + throw DatagramLimitException(__FILE__, __LINE__); } repeat: @@ -128,62 +128,62 @@ repeat: assert(_fd != INVALID_SOCKET); #ifdef _WIN32 ssize_t ret = ::send(_fd, reinterpret_cast<const char*>(&buf.b[0]), - static_cast<int>(buf.b.size()), 0); + static_cast<int>(buf.b.size()), 0); #else ssize_t ret = ::send(_fd, reinterpret_cast<const char*>(&buf.b[0]), - buf.b.size(), 0); + buf.b.size(), 0); #endif if(ret == SOCKET_ERROR) { - if(interrupted()) - { - goto repeat; - } + if(interrupted()) + { + goto repeat; + } - if(wouldBlock()) - { - repeatSelect: + if(wouldBlock()) + { + repeatSelect: - assert(_fd != INVALID_SOCKET); + assert(_fd != INVALID_SOCKET); #ifdef _WIN32 - FD_SET(_fd, &_wFdSet); - int rs = ::select(static_cast<int>(_fd + 1), 0, &_wFdSet, 0, 0); + FD_SET(_fd, &_wFdSet); + int rs = ::select(static_cast<int>(_fd + 1), 0, &_wFdSet, 0, 0); #else - struct pollfd fdSet[1]; - fdSet[0].fd = _fd; - fdSet[0].events = POLLOUT; - int rs = ::poll(fdSet, 1, -1); + struct pollfd fdSet[1]; + fdSet[0].fd = _fd; + fdSet[0].events = POLLOUT; + int rs = ::poll(fdSet, 1, -1); #endif - if(rs == SOCKET_ERROR) - { - if(interrupted()) - { - goto repeatSelect; - } - - SocketException ex(__FILE__, __LINE__); - ex.error = getSocketErrno(); - throw ex; - } - - goto repeat; - } - - SocketException ex(__FILE__, __LINE__); - ex.error = getSocketErrno(); - throw ex; + if(rs == SOCKET_ERROR) + { + if(interrupted()) + { + goto repeatSelect; + } + + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } + + goto repeat; + } + + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; } if(_traceLevels->network >= 3) { - Trace out(_logger, _traceLevels->networkCat); - out << "sent " << ret << " bytes via udp\n" << toString(); + Trace out(_logger, _traceLevels->networkCat); + out << "sent " << ret << " bytes via udp\n" << toString(); } if(_stats) { - _stats->bytesSent(type(), static_cast<Int>(ret)); + _stats->bytesSent(type(), static_cast<Int>(ret)); } assert(ret == static_cast<ssize_t>(buf.b.size())); @@ -203,16 +203,16 @@ IceInternal::UdpTransceiver::read(Buffer& buf, int) const int packetSize = min(_maxPacketSize, _rcvSize - _udpOverhead); if(packetSize < static_cast<int>(buf.b.size())) { - // - // We log a warning here because this is the server side -- without the - // the warning, there would only be silence. - // - if(_warn) - { - Warning out(_logger); - out << "DatagramLimitException: maximum size of " << packetSize << " exceeded"; - } - throw DatagramLimitException(__FILE__, __LINE__); + // + // We log a warning here because this is the server side -- without the + // the warning, there would only be silence. + // + if(_warn) + { + Warning out(_logger); + out << "DatagramLimitException: maximum size of " << packetSize << " exceeded"; + } + throw DatagramLimitException(__FILE__, __LINE__); } buf.b.resize(packetSize); buf.i = buf.b.begin(); @@ -223,107 +223,107 @@ repeat: // Check the shutdown flag. // { - IceUtil::Mutex::Lock sync(_shutdownReadWriteMutex); - if(_shutdownReadWrite) - { - throw ConnectionLostException(__FILE__, __LINE__); - } + IceUtil::Mutex::Lock sync(_shutdownReadWriteMutex); + if(_shutdownReadWrite) + { + throw ConnectionLostException(__FILE__, __LINE__); + } } ssize_t ret; if(_connect) { - // - // If we must connect, then we connect to the first peer that - // sends us a packet. - // - struct sockaddr_in peerAddr; - memset(&peerAddr, 0, sizeof(struct sockaddr_in)); - socklen_t len = static_cast<socklen_t>(sizeof(peerAddr)); - assert(_fd != INVALID_SOCKET); - ret = recvfrom(_fd, reinterpret_cast<char*>(&buf.b[0]), packetSize, - 0, reinterpret_cast<struct sockaddr*>(&peerAddr), &len); - if(ret != SOCKET_ERROR) - { - doConnect(_fd, peerAddr, -1); - _connect = false; // We are connected now. - - if(_traceLevels->network >= 1) - { - Trace out(_logger, _traceLevels->networkCat); - out << "connected udp socket\n" << toString(); - } - } + // + // If we must connect, then we connect to the first peer that + // sends us a packet. + // + struct sockaddr_in peerAddr; + memset(&peerAddr, 0, sizeof(struct sockaddr_in)); + socklen_t len = static_cast<socklen_t>(sizeof(peerAddr)); + assert(_fd != INVALID_SOCKET); + ret = recvfrom(_fd, reinterpret_cast<char*>(&buf.b[0]), packetSize, + 0, reinterpret_cast<struct sockaddr*>(&peerAddr), &len); + if(ret != SOCKET_ERROR) + { + doConnect(_fd, peerAddr, -1); + _connect = false; // We are connected now. + + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "connected udp socket\n" << toString(); + } + } } else { - assert(_fd != INVALID_SOCKET); - ret = ::recv(_fd, reinterpret_cast<char*>(&buf.b[0]), packetSize, 0); + assert(_fd != INVALID_SOCKET); + ret = ::recv(_fd, reinterpret_cast<char*>(&buf.b[0]), packetSize, 0); } if(ret == SOCKET_ERROR) { - if(interrupted()) - { - goto repeat; - } - - if(wouldBlock()) - { - repeatSelect: - - assert(_fd != INVALID_SOCKET); + if(interrupted()) + { + goto repeat; + } + + if(wouldBlock()) + { + repeatSelect: + + assert(_fd != INVALID_SOCKET); #ifdef _WIN32 - FD_SET(_fd, &_rFdSet); - int rs = ::select(static_cast<int>(_fd + 1), &_rFdSet, 0, 0, 0); + FD_SET(_fd, &_rFdSet); + int rs = ::select(static_cast<int>(_fd + 1), &_rFdSet, 0, 0, 0); #else - struct pollfd fdSet[1]; - fdSet[0].fd = _fd; - fdSet[0].events = POLLIN; - int rs = ::poll(fdSet, 1, -1); + struct pollfd fdSet[1]; + fdSet[0].fd = _fd; + fdSet[0].events = POLLIN; + int rs = ::poll(fdSet, 1, -1); #endif - if(rs == SOCKET_ERROR) - { - if(interrupted()) - { - goto repeatSelect; - } - - SocketException ex(__FILE__, __LINE__); - ex.error = getSocketErrno(); - throw ex; - } - - goto repeat; - } - - if(recvTruncated()) - { - DatagramLimitException ex(__FILE__, __LINE__); - if(_warn) - { - Warning out(_logger); - out << "DatagramLimitException: maximum size of " << packetSize << " exceeded"; - } - throw ex; - - } - - SocketException ex(__FILE__, __LINE__); - ex.error = getSocketErrno(); - throw ex; + if(rs == SOCKET_ERROR) + { + if(interrupted()) + { + goto repeatSelect; + } + + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } + + goto repeat; + } + + if(recvTruncated()) + { + DatagramLimitException ex(__FILE__, __LINE__); + if(_warn) + { + Warning out(_logger); + out << "DatagramLimitException: maximum size of " << packetSize << " exceeded"; + } + throw ex; + + } + + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; } if(_traceLevels->network >= 3) { - Trace out(_logger, _traceLevels->networkCat); - out << "received " << ret << " bytes via udp\n" << toString(); + Trace out(_logger, _traceLevels->networkCat); + out << "received " << ret << " bytes via udp\n" << toString(); } if(_stats) { - _stats->bytesReceived(type(), static_cast<Int>(ret)); + _stats->bytesReceived(type(), static_cast<Int>(ret)); } buf.b.resize(ret); @@ -352,12 +352,12 @@ IceInternal::UdpTransceiver::checkSendSize(const Buffer& buf, size_t messageSize { if(buf.b.size() > messageSizeMax) { - throw MemoryLimitException(__FILE__, __LINE__); + throw MemoryLimitException(__FILE__, __LINE__); } const int packetSize = min(_maxPacketSize, _sndSize - _udpOverhead); if(packetSize < static_cast<int>(buf.b.size())) { - throw DatagramLimitException(__FILE__, __LINE__); + throw DatagramLimitException(__FILE__, __LINE__); } } @@ -386,23 +386,23 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s { try { - _fd = createSocket(true); - setBufSize(instance); - setBlock(_fd, false); - getAddress(host, port, _addr); - doConnect(_fd, _addr, -1); - _connect = false; // We're connected now - - if(_traceLevels->network >= 1) - { - Trace out(_logger, _traceLevels->networkCat); - out << "starting to send udp packets\n" << toString(); - } + _fd = createSocket(true); + setBufSize(instance); + setBlock(_fd, false); + getAddress(host, port, _addr); + doConnect(_fd, _addr, -1); + _connect = false; // We're connected now + + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "starting to send udp packets\n" << toString(); + } } catch(...) { - _fd = INVALID_SOCKET; - throw; + _fd = INVALID_SOCKET; + throw; } #ifdef _WIN32 @@ -422,27 +422,27 @@ IceInternal::UdpTransceiver::UdpTransceiver(const InstancePtr& instance, const s { try { - _fd = createSocket(true); - setBufSize(instance); - setBlock(_fd, false); - getAddress(host, port, _addr); - if(_traceLevels->network >= 2) - { - Trace out(_logger, _traceLevels->networkCat); - out << "attempting to bind to udp socket " << addrToString(_addr); - } - doBind(_fd, _addr); - - if(_traceLevels->network >= 1) - { - Trace out(_logger, _traceLevels->networkCat); - out << "starting to receive udp packets\n" << toString(); - } + _fd = createSocket(true); + setBufSize(instance); + setBlock(_fd, false); + getAddress(host, port, _addr); + if(_traceLevels->network >= 2) + { + Trace out(_logger, _traceLevels->networkCat); + out << "attempting to bind to udp socket " << addrToString(_addr); + } + doBind(_fd, _addr); + + if(_traceLevels->network >= 1) + { + Trace out(_logger, _traceLevels->networkCat); + out << "starting to receive udp packets\n" << toString(); + } } catch(...) { - _fd = INVALID_SOCKET; - throw; + _fd = INVALID_SOCKET; + throw; } #ifdef _WIN32 @@ -467,66 +467,66 @@ IceInternal::UdpTransceiver::setBufSize(const InstancePtr& instance) for(int i = 0; i < 2; ++i) { - string direction; - string prop; - int* addr; - int dfltSize; - if(i == 0) - { - direction = "receive"; - prop = "Ice.UDP.RcvSize"; - addr = &_rcvSize; - dfltSize = getRecvBufferSize(_fd); - _rcvSize = dfltSize; - } - else - { - direction = "send"; - prop = "Ice.UDP.SndSize"; - addr = &_sndSize; - dfltSize = getSendBufferSize(_fd); - _sndSize = dfltSize; - } - - // - // Get property for buffer size and check for sanity. - // - Int sizeRequested = instance->initializationData().properties->getPropertyAsIntWithDefault(prop, dfltSize); - if(sizeRequested < _udpOverhead) - { - Warning out(_logger); - out << "Invalid " << prop << " value of " << sizeRequested << " adjusted to " << dfltSize; - sizeRequested = dfltSize; - } - - if(sizeRequested != dfltSize) - { - // - // Try to set the buffer size. The kernel will silently adjust - // the size to an acceptable value. Then read the size back to - // get the size that was actually set. - // - if(i == 0) - { - setRecvBufferSize(_fd, sizeRequested); - *addr = getRecvBufferSize(_fd); - } - else - { - setSendBufferSize(_fd, sizeRequested); - *addr = getSendBufferSize(_fd); - } - - // - // Warn if the size that was set is less than the requested size. - // - if(*addr < sizeRequested) - { - Warning out(_logger); - out << "UDP " << direction << " buffer size: requested size of " - << sizeRequested << " adjusted to " << *addr; - } - } + string direction; + string prop; + int* addr; + int dfltSize; + if(i == 0) + { + direction = "receive"; + prop = "Ice.UDP.RcvSize"; + addr = &_rcvSize; + dfltSize = getRecvBufferSize(_fd); + _rcvSize = dfltSize; + } + else + { + direction = "send"; + prop = "Ice.UDP.SndSize"; + addr = &_sndSize; + dfltSize = getSendBufferSize(_fd); + _sndSize = dfltSize; + } + + // + // Get property for buffer size and check for sanity. + // + Int sizeRequested = instance->initializationData().properties->getPropertyAsIntWithDefault(prop, dfltSize); + if(sizeRequested < _udpOverhead) + { + Warning out(_logger); + out << "Invalid " << prop << " value of " << sizeRequested << " adjusted to " << dfltSize; + sizeRequested = dfltSize; + } + + if(sizeRequested != dfltSize) + { + // + // Try to set the buffer size. The kernel will silently adjust + // the size to an acceptable value. Then read the size back to + // get the size that was actually set. + // + if(i == 0) + { + setRecvBufferSize(_fd, sizeRequested); + *addr = getRecvBufferSize(_fd); + } + else + { + setSendBufferSize(_fd, sizeRequested); + *addr = getSendBufferSize(_fd); + } + + // + // Warn if the size that was set is less than the requested size. + // + if(*addr < sizeRequested) + { + Warning out(_logger); + out << "UDP " << direction << " buffer size: requested size of " + << sizeRequested << " adjusted to " << *addr; + } + } } } |