Recvfrom函数在网络编程中扮演什么角色?

recvfrom函数详解

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

示例代码

以下是一个简单的使用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] = '