Beispiel #1
0
void TCPSocket::Write(const char* buffer, size_t bufferLen)
{
  if (tls.get())
  {
    tls->Write(buffer, bufferLen);
    return;
  }
  
  size_t written = 0;
  ssize_t result;
  while (bufferLen - written > 0)
  {
    while ((result = write(socket, buffer + written, bufferLen - written)) < 0)
    {
      boost::this_thread::interruption_point();
      if (errno != EINTR)
      {
        if (errno == EWOULDBLOCK || errno == EAGAIN || errno == ETIMEDOUT)
          throw TimeoutError();
        else
          throw NetworkSystemError(errno);
      }
    } 
    boost::this_thread::interruption_point();
    written += result;
  }
}
Beispiel #2
0
void TCPSocket::Accept(TCPListener& listener)
{
  struct sockaddr_storage addrStor;
  socklen_t addrLen = sizeof(addrStor);
  struct sockaddr* addr = reinterpret_cast<struct sockaddr*>(&addrStor);

  int socket;
  while ((socket = accept(listener.Socket(), addr, &addrLen)) < 0)
  {
    boost::this_thread::interruption_point();
    if (errno != EINTR)
    {
      if (errno == EWOULDBLOCK || errno == EAGAIN || errno == ETIMEDOUT)
        throw TimeoutError();
      else
        throw NetworkSystemError(errno);
    }
  }
  
  auto socketGuard = util::MakeScopeError([&socket]() { close(socket); }); (void) socketGuard;
  
  boost::this_thread::interruption_point();
  PopulateRemoteEndpoint(socket);
  PopulateLocalEndpoint(socket);
  
  std::lock_guard<std::mutex> lock(socketMutex);
  this->socket = socket;
}
Beispiel #3
0
void
ebbrt::SimpleRemoteHashTable::HandleTimeout(unsigned op_id)
{
  auto it = promise_map_.find(op_id);
  if (it != promise_map_.end()) {
    it->second.SetException(make_exception_ptr(TimeoutError()));
    promise_map_.erase(it);
  }
}
Beispiel #4
0
	void Error::translate(RemoteDB::Error e)
	{
		switch(e.code())
		{
			//case SUCCESS : return "NoError";
			case NOIMPL  : throw NotImplementedError(e);
			case INVALID : throw InvalidError(e);
			case LOGIC   : throw LogicError(e);
			case TIMEOUT : throw TimeoutError(e);
			case INTERNAL: throw InternalError(e);
			case NETWORK : throw NetworkError(e);
			case EMISC   : throw MiscError(e);
			default      : throw Error(e);
		}
	}
Beispiel #5
0
void TCPSocket::Connect(const Endpoint& remoteEndpoint, const Endpoint* localEndpoint)
{
  assert(socket < 0);
  int socket = ::socket(static_cast<int>(remoteEndpoint.Family()), SOCK_STREAM, 0);
  if (socket < 0) throw NetworkSystemError(errno);

  auto socketGuard = util::MakeScopeError([&socket]() { close(socket); }); (void) socketGuard;
  
  int optVal = 1;
  setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal));

  SetTimeout(socket);
  
  if (localEndpoint)
  {
    socklen_t addrLen = localEndpoint->Length();
    struct sockaddr_storage addrStor;
    memcpy(&addrStor, localEndpoint->Addr(), addrLen);
    struct sockaddr* addr = reinterpret_cast<struct sockaddr*>(&addrStor);

    if (bind(socket, addr, addrLen) < 0)
    {
      int errno_ = errno;
      throw util::net::NetworkSystemError(errno_);
    }
  }
  
  while (connect(socket, remoteEndpoint.Addr(), remoteEndpoint.Length()) < 0)
  {
    boost::this_thread::interruption_point();
    if (errno != EINTR)
    {
      int errno_ = errno;
      if (errno_ == EWOULDBLOCK || errno_ == EAGAIN || errno_ == ETIMEDOUT)
        throw TimeoutError();
      else
        throw NetworkSystemError(errno_);
    }
  }
  
  boost::this_thread::interruption_point();
  PopulateRemoteEndpoint(socket);
  PopulateLocalEndpoint(socket);
  
  std::lock_guard<std::mutex> lock(socketMutex);
  this->socket = socket;
}
Beispiel #6
0
size_t TCPSocket::Read(char* buffer, size_t bufferSize)
{
  if (tls.get()) return tls->Read(buffer, bufferSize);

  ssize_t result;
  while ((result = read(socket, buffer, bufferSize)) < 0)
  {
    boost::this_thread::interruption_point();
    if (errno != EINTR)
    {
      if (errno == EWOULDBLOCK || errno == EAGAIN || errno == ETIMEDOUT)
        throw TimeoutError();
      else
        throw NetworkSystemError(errno);
    }
  }

  boost::this_thread::interruption_point();
  if (!result) throw EndOfStream();
  
  return result;
}
Beispiel #7
0
void TLSSocket::EvaluateResult(int result)
{
  switch (SSL_get_error(session, result))
  {
    case SSL_ERROR_WANT_READ    :
    case SSL_ERROR_WANT_WRITE   :
    {
      break;
    }
    case SSL_ERROR_SSL          :
    {
      throw TLSProtocolError();
    }
    case SSL_ERROR_ZERO_RETURN  :
    {
      throw EndOfStream();
    }
    case SSL_ERROR_SYSCALL      :
    {
      int error = ERR_get_error();
      if (error) throw TLSProtocolError();
      else if (!result) throw EndOfStream();
      else if (result == -1) 
      {
        if (errno == EWOULDBLOCK || errno == EAGAIN || errno == ETIMEDOUT)
          throw TimeoutError();
        else
          throw TLSSystemError(errno);
      }
    }
    default                     :
    {
      throw TLSError();
    }
  }
}