コード例 #1
0
ファイル: CwxSocket.cpp プロジェクト: chenper/cwinux
ssize_t CwxSocket::recv_n (CWX_HANDLE handle,
                void *buf,
                size_t len,
                CwxTimeouter *timeout,
                size_t* accepted)
{
    size_t recv_byte = 0;
    ssize_t ret = 0;
    while(recv_byte < len)
    {
        if (timeout && timeout->isTimer())
        {
            ret = handleReady(handle, timeout, true, false, false);
            if (ret <= 0)
            {
                ret = -1;
                break;
            }
        }
        ret = ::read(handle, ((char*)buf) + recv_byte, len - recv_byte);
        if ( (-1 == ret) && (EINTR == errno) ) continue;
        if (0 >= ret)
            break;
        recv_byte += ret;
    }
    if (accepted) *accepted = recv_byte;
    return ret>0?recv_byte:ret;
}
コード例 #2
0
ファイル: CwxSocket.cpp プロジェクト: chenper/cwinux
ssize_t CwxSocket::send_n (CWX_HANDLE handle,
                       void const*buf,
                       size_t len,
                       int flags,
                       CwxTimeouter *timeout,
                       size_t* sent)
{
    size_t send_byte = 0;
    ssize_t ret = 0;
    while(send_byte < len)
    {
        if (timeout && timeout->isTimer())
        {
            ret = handleReady(handle, timeout, false, true, false);
            if (ret <= 0)
            {
                ret = -1;
                break;
            }
        }
        ret = ::send(handle, ((char*)buf) + send_byte, len - send_byte, flags);
        if ( (-1 == ret) && (EINTR == errno) ) continue;
        if (0 >= ret)
            break;
        send_byte += ret;
    }
    if (sent) *sent = send_byte;
    return ret>0?send_byte:ret;

}
コード例 #3
0
ファイル: SocketStream.cpp プロジェクト: wuhua988/icm
ssize_t
SocketStream::recv_n (void *buf,
                      size_t len,
                      const TimeValue *timeout ,
                      size_t *bytesTransferred )
{
  size_t temp;
  size_t &bt = bytesTransferred == 0 ? temp : *bytesTransferred;
  ssize_t n;
  ssize_t result = 0;
  int error = 0;

  enable(ACE_NONBLOCK);

  for (bt = 0;
      bt < len;
      bt += n)
    {
      // Try to transfer as much of the remaining data as possible.
      // Since the socket is in non-blocking mode, this call will not
      // block.
      n = OS::recv (m_handle,
                        static_cast <char *> (buf) + bt,
                        len - bt);

//      ICC_ERROR("recv_n, n = %d, errno = %d, toRecv = %d", n, errno, len - bt);
      // Check for errors.
      if (n == 0 ||
          n == -1)
        {
          // Check for possible blocking.
          if (n == -1 && (errno == EWOULDBLOCK || errno == 0))
            {
              // Wait upto <timeout> for the blocking to subside.
                int rtn = handleReady(m_handle, timeout, 1, 0, 0);

              // Did select() succeed?
              if (rtn != -1)
                {
                  // Blocking subsided in <timeout> period.  Continue
                  // data transfer.
                  n = 0;
                  continue;
                }
            }

          // Wait in select() timed out or other data transfer or
          // select() failures.
          error = 1;
          result = n;
//          ICC_ERROR("recv_n error, result = %d, errno = %d", result, errno);
          break;
        }
    }

  if (error)
    return result;
  else
    return static_cast<ssize_t> (bt);
}
コード例 #4
0
bool HandleExecutionQueue::enqueue(QPndman::Handle* handle)
{
  connect(handle, SIGNAL(done()), this, SLOT(handleReady()));
  connect(handle, SIGNAL(cancelled()), this, SLOT(handleReady()));
  connect(handle, SIGNAL(error(QString)), this, SLOT(handleReady()));

  if(currentlyExecuting < maxExecuting)
  {
    execute(handle);
    return false;
  }
  else
  {
    handles.enqueue(handle);
    return true;
  }
}