recvfrom函数详解
recvfrom 是一个在网络编程中常用的系统调用,主要用于接收来自套接字的数据,并获取发送方的地址信息,本文将详细介绍recvfrom函数的定义、参数、返回值以及使用示例,并通过表格形式归纳其常见错误代码及处理方法。
定义与功能
recvfrom函数用于从绑定的套接字中接收数据报,并捕获发送方的地址信息,它通常用于无连接协议(如UDP)的通信中。
函数原型
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
参数说明
参数名 | 类型 | 描述 |
sockfd | int | 标识已绑定套接字的文件描述符。 |
buf | void | 指向接收数据缓冲区的指针。 |
len | size_t | 缓冲区的长度(以字节为单位)。 |
flags | int | 标志位,用于修改函数的行为,例如MSG_WAITALL表示等待所有数据到达。 |
src_addr | struct sockaddr | 指向存储发送方地址的sockaddr结构体指针。 |
addrlen | socklen_t | 指向src_addr大小的指针,调用时设置为sizeof(*src_addr),返回时更新为实际大小。 |
返回值
成功时返回接收到的字节数。
失败时返回-1,并设置errno来指示错误原因。
示例代码
以下是一个简单的使用recvfrom函数接收数据的示例:
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MAX_BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t client_len; char buffer[MAX_BUFFER_SIZE]; ssize_t recv_len; // 创建套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // 配置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8888); // 绑定套接字 if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d ", ntohs(server_addr.sin_port)); // 接收数据 while (1) { client_len = sizeof(client_addr); recv_len = recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &client_len); if (recv_len < 0) { perror("recvfrom failed"); exit(EXIT_FAILURE); } buffer[recv_len] = '