首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux recv函数

recv 函数是 Linux 系统中用于从套接字接收数据的系统调用。它允许程序从已连接的套接字中读取数据。这个函数通常用于网络编程,特别是在客户端和服务器之间的通信中。

基础概念

recv 函数的原型如下:

代码语言:txt
复制
int recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd 是一个整数,表示要从中接收数据的套接字描述符。
  • buf 是一个指向缓冲区的指针,该缓冲区将用于存储接收到的数据。
  • len 是一个 size_t 类型的值,表示缓冲区的大小。
  • flags 是一个整数,用于指定接收操作的选项。

优势

  • 灵活性recv 函数允许开发者控制接收数据的大小和方式。
  • 效率:直接与操作系统交互,可以高效地处理大量数据。
  • 兼容性:作为标准的网络 API,它在各种 Unix-like 系统中广泛支持。

类型

recv 函数可以用于不同类型的网络通信:

  • TCP:可靠的、面向连接的协议,适用于需要确保数据完整性的应用。
  • UDP:无连接的协议,适用于对速度要求高但可以容忍数据丢失的应用。

应用场景

  • Web 服务器:接收来自客户端的 HTTP 请求。
  • 聊天应用:接收用户发送的消息。
  • 文件传输:接收通过网络发送的文件。

常见问题及解决方案

问题:为什么 recv 返回 -1?

这通常表示发生了错误。常见的错误原因包括:

  • 网络问题:如连接中断。
  • 资源限制:如缓冲区太小。
  • 权限问题:如没有足够的权限访问套接字。

解决方案

检查 errno 变量以确定具体的错误原因,并采取相应的措施。例如:

代码语言:txt
复制
int ret = recv(sockfd, buffer, sizeof(buffer), 0);
if (ret == -1) {
    perror("recv failed");
    // 根据 errno 进行错误处理
}

问题:为什么 recv 返回 0?

这通常表示对端已经关闭了连接。

解决方案

处理连接关闭的情况,例如清理资源并退出循环。

代码语言:txt
复制
int ret = recv(sockfd, buffer, sizeof(buffer), 0);
if (ret == 0) {
    printf("Connection closed by peer\n");
    // 清理资源并退出
}

问题:为什么 recv 阻塞?

默认情况下,recv 是阻塞的,即如果没有数据可读,它会一直等待。

解决方案

使用 flags 参数设置非阻塞模式,或者使用 selectpollepoll 等机制来检查套接字是否可读。

代码语言:txt
复制
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

int ret = recv(sockfd, buffer, sizeof(buffer), flags);
if (ret == -1 && errno == EAGAIN) {
    // 套接字不可读,处理其他任务
}

参考链接

通过以上信息,你应该对 recv 函数有了全面的了解,并能够解决常见的相关问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

linux recv返回值,recv recvfrom

recv和recvfrom都是用来接受来自的网络的数据。...来看看它们的原型: int recv( SOCKET, char FAR*, int, int ); int recvfrom( SOCKET, char FAR*, int, int, struct...在linux下面的定义只是将SOCKET改成int,那么在linux下面的原型是这样: int recv( int, char FAR*, int, int ); int recvfrom( int,...在linux中所有的设备,如磁盘,光驱,U盘甚至我们这里的讨论的网络也都被看作是文件。 我们看看这两个函数在功用上的共同点和不同点: 共同点: 1. 都是用来接受来自网络的数据 2....定义,它的值也是-1; 关于这里的“套接字关闭”需要注意,2个函数在用在流式套接字和数据报套接字时,套接字表示的含义不一样,前者表示客户端套接字,而后者表示的是自己的套接字。

2.9K20

recv&send函数

socket函数创建一个文件描述符fd,一个fd 对应两个缓冲区,一个输入缓冲区,一个输出缓冲区。 而recv和send函数就是对这两个函数进行操作。...一、recv函数 int recv( SOCKET s, char *buf, int len, int flags); 函数功能:不论客户端还是服务端都能通过recv从TCP另一端接收数据。...的recv函数的执行流程:当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,(发送先) 如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR...,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。...recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数; 如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了

1.2K20
  • linux网络编程之socket(六):利用recv和readn函数实现readline函数

    可变长字段的协议用readn来读就很不方便了,为此我们实现一个类似于fgets的readline函数。 首先来看一个跟read 相似的系统函数recv。  ...flags); recv函数与read函数类似,但只能读取套接字描述符,而不能是一般的文件描述符,且多了一个标志参数。...下面使用封装后的recv函数实现readline函数: /* recv()只能读写套接字,而不能是一般的文件描述符 */ ssize_t recv_peek(int sockfd, void *buf,...,我们先用recv_peek”偷窥“ 一下现在缓冲区有多少个字符并读取到bufp,然后查看是否存在换行符'\n'。...参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》 《UNP》

    2.1K10

    recv函数说明返回值

    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据...这里只描述同步Socket的recv函数的执行流程。...当应用程序调用recv函数时, (1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR, (2)如果s...当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中 (注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。...recv函数仅仅是copy数据,真正的接收数据是协议来完成的), recv函数返回其实际copy的字节数。

    5K10

    send()、sendto()和recv()、recvfrom()的使用

    本文收录于微信公众号「 LinuxOK 」,ID为:Linux_ok,关注公众号第一时间获取更多技术学习文章。...需要为套接字指定接收方的地址/端口(这样该函数才知道要把数据发往哪里),在调用recv()之前,可以为套接字指定发送方的地址/端口,这样该函数就只接收指定的发送方的数据,当然若不指定也可,该函数就可以接收任意的地址的数据...(这些内容前面文章udp通讯中的connect()和bind()函数 有详细讲过) 这4个函数的使用比较简单,但在一个实例中,遇到一个小问题。...实现功能: udp服务器创建一个套接字接收客户端的连接,连接成功后,服务器再创建一个套接字与客户端进行数据交互,要求尽量使用connect()和recv()、send()函数。...()三个函数的搭配使用并不能说一定能代替sendto()、recvfrom(),具体使用还要依据代码场景。

    1.8K20

    linux中getchar函数用法,linux getchar函数使用

    1 函数介绍 1) 函数原型 int getchar(void); 2) 函数功能 从stdin中读取一个字符。 3) 返回值 返回读取字符的ASCII值或者EOF字符或者出错值。...4) 头文件 #include 2 函数使用 2.1 getchar函数的特点 Linux下编写的一个例子: #include int main(void) { char ch; int num...重新编译并运行程序,输入字符串:hello[回车] 得第一次运行结果 当程序首次执行到while中的getchar时,getchar函数等待用户的输入,getchar函数一直等待用户输入,当用户按下回车表示用户输入完毕...getchar函数读取,因为while循环的条件已经为假)并得到以下输出界面 String输入字符串的长度为6在一次表明getchar读取了用户输入的回车。...3 额外总结 函数本身的特性与语句条件限制两者各自带来的作用需要分清楚。 Note Over。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    3.2K30
    领券