函数原型:
size_trecv(intsockfd,void *buf,size_t len,int flags );
该函数的第一个参数创建接收套接字描述符;
第二个参数表示存储recv函数接收的数据的缓冲区。
第三个参数表示缓冲区buf的长度。
第四个参数通常设置为0 (标志位)
recv函数返回实际copy的字节数。 如果在复制期间recv出错,则返回SOCKET_ERROR; 如果网络在等待协议接收数据时中断,recv函数将返回0。
recv函数只是一个拷贝数据,真正的接收数据是通过协议实现的。
默认的recv函数套接字被阻止
块和非块recv返回值没有区别,都是
0错误
=0关闭连接
0接收数据大小、
特殊:如果值为0,且(errno==eintr|| errno==ewouldblock|| errno==e again ) ),则认为连接正常,并继续接收。
但是,在块模式下recv将接收数据块化,在非块模式下如果没有数据则返回,不块地读取,因此需要循环读取)。
返回说明:
如果执行成功,则返回已接收的字节数。 如果另一端是封闭的,则返回0。 失败返回-1,errno被设置为以下值之一
EAGAIN :套接字已标记为非阻塞,接收操作已被阻塞或接收超时
EBADF:sock不是有效的说明词
ECONNREFUSE :远程主机阻止网络连接
EFAULT :内存空间访问错误
EINTR :操作被红绿灯中断
EINVAL :参数无效
ENOMEM :内存不足
ENOTCONN :与面向连接相关联的套接字尚未连接
ENOTSOCK:sock索引中的不是套接字
如果返回值为0,则连接正常关闭。