recv函数
作用:该函数用于从一个套接字中接收数据。
//表头文件:
#include<sys/types.h>
#include<sys/socket.h>
//函数定义
int ret = recv (int __fd, void *__buf, size_t __n, int __flags)
//fd:从文件描述符fd中读取数据。
//buf:用于接收数据的缓冲区。
//len:缓冲区长度。
//flags:指定调用方式,通常指定为0。
注意:
- 如果在读取的过程中出现了网络错误,则会返回错误 SOCKET_ERROR。
- 如果是在文件描述符非阻塞的情况下进行数据的读取,当全部的数据读取完毕时,会设置错误号**(注意不是返回)**EAGAIN 或者是 EWOULDBLOCK。
- 当返回值大于0时,表示读取到了ret个字节的字符。
- 当返回值等于0时,表示客户端(数据发送方断开了连接)。
- 当返回值小于0时,则读取数据失败。
下面的案例是往一个readbuf缓冲区不断的读取数据
(假设每次读到的数据小于readbuf,则需要read_idx来标记接下来读取到的数据拼接在readbuf的哪个位置)
// 读取到的字节
int bytes_read = 0;
char readbuf[1024] = {0};
while (true) {
bytes_read = recv(fd, readbuf + read_idx, 1024 - read_idx, 0);
if (bytes_read == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
break; //表示没有数据了
}
return false; //遇见其他错误
} else if (bytes_read == 0) {
//对方关闭连接
break;
}
read_idx += bytes_read;
}