0


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

recv()

函数是网络编程中常用的一个函数,特别是在使用 TCP 套接字时。它用于从连接的套接字接收数据。

recv()

函数的原型在 POSIX 兼容系统中通常如下:

#include<sys/socket.h>ssize_trecv(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){// 成功接收到数据,处理数据// ...}elseif(bytesRead ==0){// 连接已经正常关闭// 可以选择关闭本地套接字,或者进行其他清理工作// ...}else{// 接收操作失败if(errno == EAGAIN || errno == EWOULDBLOCK){// 在非阻塞模式下,没有数据可读,可以根据需要处理// ...}else{// 其他错误,打印错误信息或进行其他错误处理perror("recv failed");// 根据需要关闭套接字或进行其他清理工作// ...}}
标签: linux tcp/ip tcp

本文转载自: https://blog.csdn.net/icon_sunshine/article/details/140841832
版权归原作者 闲人怪喵 所有, 如有侵权,请联系我们删除。

“recv()函数返回值说明,用返回值确定不同的情况”的评论:

还没有评论