ACE_Stream中提供recv_n函數,該函數要求輸入參數len表示要接受的字節數。
當代碼中調用該函數時,程序會一直阻塞在recv_n函數調用的地方,只到recv_n對應的描敘符接收到了len個字節或者連接斷開。
recv_n代碼:
ACE::recv_n_i (ACE_HANDLE handle,
void *buf,
size_t len,
int flags,
size_t *bt)
{
size_t temp;
size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
// Try to transfer as much of the remaining data as possible.
n = ACE_OS::recv (handle,
static_cast <char *> (buf) + bytes_transferred,
len - bytes_transferred,
flags);
// Check EOF.
if (n == 0)
return 0;
// Check for other errors.
if (n == -1)
{
// Check for possible blocking.
if (errno == EWOULDBLOCK)
{
// Wait for the blocking to subside.
int const result = ACE::handle_read_ready (handle, 0);
// Did select() succeed?
if (result != -1)
{
// Blocking subsided. Continue data transfer.
n = 0;
continue;
}
}
// Other data transfer or select() failures.
return -1;
}
}
return static_cast<ssize_t> (bytes_transferred);
}