SocketAddress SocketServer::getsockname() const { socklen_t addrlen = 0; int ret = ::getsockname(_privateData->_fd, 0, &addrlen); if (ret == -1) { int errorNumber = errno; throw TransportError(errnoToUtf8(errorNumber)); } SharedPtr<SocketAddress::PrivateData> privateData = SocketAddress::PrivateData::create(addrlen); struct sockaddr* sockaddr = SocketAddress::PrivateData::sockaddr(privateData.get()); addrlen = SocketAddress::PrivateData::capacity(privateData.get()); ret = ::getsockname(_privateData->_fd, sockaddr, &addrlen); if (ret == -1) { int errorNumber = errno; throw TransportError(errnoToUtf8(errorNumber)); } SocketAddress::PrivateData::setAddrlen(privateData.get(), addrlen); return SocketAddress(privateData.get()); }
QString TSPacket::toString() const { QString str; str.append("TSPacket @0x%1 ").arg(long(&data()[0]),0,16); str.append("raw: 0x%1 0x%2 0x%3 0x%4\n").arg(int(data()[0]),0,16). arg(int(data()[1]),0,16).arg(int(data()[2]),0,16).arg(int(data()[3]),0,16); str.append(" inSync: %1\n").arg( HasSync()); str.append(" transportError: %1\n").arg( TransportError()); str.append(" payloadStart: %1\n").arg( PayloadStart() ); str.append(" priority: %1\n").arg( Priority() ); str.append(" pid: %1\n").arg( PID() ); str.append(" scrampled: %1\n").arg( ScramplingControl() ); str.append(" adaptationFieldControl: %1\n").arg( AdaptationFieldControl() ); str.append(" continuityCounter: %1\n").arg( ContinuityCounter() ); return str; }
ssize_t SocketWakeupEvent::read() { char data[512]; ssize_t ret = ::read(_privateData->_fd, data, sizeof(data)); if (ret == -1) { int errorNumber = errno; if (errorNumber == EAGAIN || errorNumber == EINTR) return 0; throw TransportError(errnoToUtf8(errorNumber)); } if (ret == 0) return -1; return ret; }
ssize_t SocketWakeupEvent::read() { char data[512]; ssize_t ret = ::recv(_privateData->_socket, data, sizeof(data), 0); if (ret == SOCKET_ERROR) { int errorNumber = WSAGetLastError(); if (errorNumber == WSAEWOULDBLOCK || errorNumber == WSAEINTR || errorNumber == WSAEINPROGRESS) return 0; throw TransportError(errnoToUtf8(errorNumber)); } if (ret == 0) return -1; return ret; }
PrivateData() : _wakeupReadFd(-1), _wakeupWriteFd(-1) { int pipeFd[2] = {-1, -1}; if (-1 == nonblocking_pipe(pipeFd)) { int errorNumber = errno; for (unsigned i = 0; i < 2; ++i) { if (pipeFd[i] == -1) continue; close(pipeFd[i]); } throw TransportError(errnoToUtf8(errorNumber)); } _wakeupReadFd = pipeFd[0]; _wakeupWriteFd = pipeFd[1]; }
void wakeUp() { // Check if we already have a wakeup pending if (!_wokenUp.compareAndExchange(0, 1, Atomic::MemoryOrderAcqRel)) return; // No, the first one, write to the pipe char data = 1; for (;;) { ssize_t ret = ::write(_wakeupWriteFd, &data, sizeof(data)); if (ret == 1) break; // We should not get EAGAIN here, since we only write the first time to wake up, // but be paranoid. if (ret == 0) continue; int errorNumber = errno; if (ret == -1 && (errorNumber == EAGAIN || errorNumber == EINTR)) continue; throw TransportError(errnoToUtf8(errorNumber)); } }