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());
}
Example #2
0
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));
   }
 }