recv函数
时间: 2025-08-03 17:52:13 浏览: 8
### recv 函数在网络编程中的作用
在网络编程中,`recv` 函数用于从一个已连接的套接字接收数据。该函数通常用于 TCP 协议中,用于接收对端发送的数据[^3]。`recv` 函数的基本作用是将数据从内核空间复制到用户空间,以便应用程序可以处理接收到的数据。
`recv` 的函数原型如下:
```c
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
```
- `sockfd`:表示要接收数据的套接字描述符。
- `buf`:指向存储接收到数据的缓冲区。
- `len`:指定最多可以接收的字节数。
- `flags`:通常设置为 0,也可以用于指定一些标志,例如 `MSG_PEEK` 或 `MSG_WAITALL`。
### recv 函数的使用方法
1. **阻塞模式**:在默认情况下,`recv` 是阻塞的,即当没有数据可读时,函数会一直等待,直到有数据到达或连接被关闭[^2]。
2. **非阻塞模式**:可以通过 `fcntl` 或 `setsockopt` 设置套接字为非阻塞模式,这样 `recv` 在没有数据时会立即返回错误码 `EAGAIN` 或 `EWOULDBLOCK`。
3. **设置超时**:为了避免 `recv` 长时间阻塞,可以使用 `setsockopt` 设置接收超时时间,这样在指定时间内没有数据到达时,`recv` 会返回超时错误[^2]。
### 使用示例
以下是一个简单的 TCP 客户端示例,演示如何使用 `recv` 接收服务器发送的数据:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[BUFFER_SIZE] = {0};
// 创建 socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket creation error");
return -1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将 IP 地址从字符串转换为网络地址
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
perror("inet_pton error");
return -1;
}
// 连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("connection failed");
return -1;
}
// 接收数据
int valread = recv(sock, buffer, BUFFER_SIZE, 0);
if (valread < 0) {
perror("recv error");
} else if (valread == 0) {
printf("Server closed the connection\n");
} else {
printf("Received: %s\n", buffer);
}
close(sock);
return 0;
}
```
### recv 返回值的含义
- **正数**:表示实际接收到的字节数。
- **0**:表示对端已经关闭了连接。
- **-1**:表示发生了错误,可以通过 `errno` 获取具体的错误码。
### 注意事项
- 在使用 `recv` 时,需要考虑数据的完整性,因为一次 `recv` 调用可能只接收部分数据。
- 如果使用阻塞模式,建议设置超时机制,以防止程序长时间阻塞在 `recv` 上。
- 在多线程或异步编程中,确保对 `recv` 的调用是线程安全的,避免多个线程同时操作同一个套接字。
阅读全文
相关推荐


















