socket 通信之 recv函数

recv函数

作用:该函数用于从一个套接字中接收数据。

//表头文件:
#include
#include

//函数定义
int ret = recv (int __fd, void *__buf, size_t __n, int __flags)
//fd:从文件描述符fd中读取数据。
//buf:用于接收数据的缓冲区。
//len:缓冲区长度。
//flags:指定调用方式,通常指定为0。

注意:

  1. 如果在读取的过程中出现了网络错误,则会返回错误 SOCKET_ERROR。
  2. 如果是在文件描述符非阻塞的情况下进行数据的读取,当全部的数据读取完毕时,会设置错误号**(注意不是返回)**EAGAIN 或者是 EWOULDBLOCK。
  3. 当返回值大于0时,表示读取到了ret个字节的字符。
  4. 当返回值等于0时,表示客户端(数据发送方断开了连接)。
  5. 当返回值小于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;     
}

你可能感兴趣的:(Linux网络通信,c++,linux,websocket)