recv()函数返回值说明,用返回值确定不同的情况

recv() 函数是网络编程中常用的一个函数,特别是在使用 TCP 套接字时。它用于从连接的套接字接收数据。recv() 函数的原型在 POSIX 兼容系统中通常如下:

#include <sys/socket.h>

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd 是要接收数据的套接字描述符。
  • buf 是一个指向缓冲区的指针,该缓冲区用于存储接收到的数据。
  • len 是缓冲区的大小,即最多可以接收的字节数。
  • flags 是用来修改接收操作的标志,通常设置为 0。

recv() 函数的返回值

recv() 函数的返回值用于指示接收操作的结果,具体有以下几种情况:

  1. 返回值 > 0:表示成功接收到了数据,返回值是实际接收到的字节数。如果接收到的数据量小于请求的数量(len),这可能是因为对端发送的数据量不足,或者对方已经关闭了连接(正常关闭),或者发生了某种错误(但非致命错误,如非阻塞套接字上没有数据可读)。

  2. 返回值 = 0:表示连接已经正常关闭。这是 TCP 连接的“有序释放”过程的一部分,表示对端已经发送了 FIN 包,并且本端已经确认。此时,不应该再从这个套接字上读取或写入数据,除非重新建立连接。

  3. 返回值 = -1:表示接收操作失败。此时,应该检查全局变量 errno 以获取具体的错误原因。可能的错误包括但不限于:

    • EAGAINEWOULDBLOCK:在非阻塞模式下,没有数据可读。
    • EINTR:接收操作被信号中断。
    • ECONNRESET:对端异常关闭了连接。
    • EBADF:无效的套接字描述符。
    • 其他错误码,具体含义可以参考系统文档或手册。

如何使用返回值确定不同的情况

在使用 recv() 函数时,可以通过检查其返回值来确定不同的操作结果,并据此进行相应的处理。以下是一个简单的示例:

ssize_t bytesRead;
char buffer[1024];

// 假设 sockfd 是一个已经连接的套接字描述符
bytesRead = recv(sockfd, buffer, sizeof(buffer), 0);
if (bytesRead > 0) {
    // 成功接收到数据,处理数据
    // ...
} else if (bytesRead == 0) {
    // 连接已经正常关闭
    // 可以选择关闭本地套接字,或者进行其他清理工作
    // ...
} else {
    // 接收操作失败
    if (errno == EAGAIN || errno == EWOULDBLOCK) {
        // 在非阻塞模式下,没有数据可读,可以根据需要处理
        // ...
    } else {
        // 其他错误,打印错误信息或进行其他错误处理
        perror("recv failed");
        // 根据需要关闭套接字或进行其他清理工作
        // ...
    }
}
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值