2.3.7 接收数据
接收数据与发送数据一样容易。下面是recv()函数的函数定义:
int recv( int socket, char *buffer, int len, int flags );
你可能已经看到了,这些参数与send()函数中的参数是一样的,因此可以类似于下面这样来调用它:
char buffer[128];
int received;
received = recv( datasock, buffer, 128, 0 );
这创建一个足够容纳128字节数据的缓冲区,然后就等待数据流入。需要注意的是,这一函数在接收满128字节数据之前就可能返回,它最多只接收128字节,因此不必担心缓冲区溢出。
同样,如果函数执行失败,则返回-1。表2.9列出了此函数的错误代码。
表2.9 recv () 函数的错误代码
|
错 误 |
含 义 |
|
ENETDOWN |
网络已经失败并断开 |
|
EFAULT |
一个或多个参数无效 |
|
ENOTCONN |
套接字没有被连接 |
|
EINPROGRESS |
对此函数的调用仍在进行中,因此不能完成新的调用 |
|
ENETRESET |
网络已经复位,连接已经断开 |
|
ENOTSOCK |
传递过来的套接字描述符不是真正的套接字 |
|
EOPNOTSUPP |
套接字不支持这一函数或选项 |
|
ESHUTDOWN |
套接字已经被关闭 |
|
EWOULDBLOCK |
函数由于阻塞而退出 |
|
EINVAL |
套接字无效 |
续表
|
错 误 |
含 义 |
|
ECONNABORTED |
连接异常中止,套接字不再可用 |
|
ETIMEDOUT |
连接被出乎意料地关闭 |
|
ECONNRESET |
连接被对方关闭 |
|
WSAENOTINITIALIZED(注释1) |
Socket库没有初始化 |
注释1:只适用于Winsock。
需要注意的是,recv()也是一个阻塞函数。它停止当前线程中的一切操作,并等待下一个TCP包到达。






