温馨提示×

Linux的recvfrom函数怎么使用

小亿
119
2023-09-26 17:59:30
栏目: 编程语言

recvfrom函数是Linux系统提供的用于接收数据的网络函数之一。它常用于从一个已经建立好的套接字(socket)中接收数据。

下面是recvfrom函数的基本语法:

#include <sys/types.h>

#include <sys/socket.h>

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

                struct sockaddr *src_addr, socklen_t *addrlen);

参数说明:

sockfd:套接字描述符,即需要从该套接字接收数据。

buf:指向接收缓冲区的指针,用于存储接收到的数据。

len:接收缓冲区的大小,即可以接收的最大字节数。

flags:接收操作的标志,一般可以设置为0。

src_addr:指向发送方地址结构体的指针。在接收数据时,该参数会被填充为发送方的地址信息。

addrlen:发送方地址结构体的长度,在函数调用前需要将其初始化为发送方地址结构体的实际长度。

返回值:

-1:表示接收数据出错。

0:表示对端已关闭连接。

大于0:表示实际接收到的字节数。

下面是一个简单的示例,展示了如何使用recvfrom函数接收UDP套接字中的数据:

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#define BUF_SIZE 1024

int main() {

    int sockfd;

    struct sockaddr_in server_addr, client_addr;

    socklen_t addr_len = sizeof(client_addr);

    char buffer[BUF_SIZE];

    // 创建套接字

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd < 0) {

        perror("socket creation failed");

        exit(EXIT_FAILURE);

    }

    // 绑定本地地址和端口

    server_addr.sin_family = AF_INET;

    server_addr.sin_port = htons(8080);

    server_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {

        perror("bind failed");

        exit(EXIT_FAILURE);

    }

    // 接收数据

    ssize_t recv_bytes = recvfrom(sockfd, buffer, BUF_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);

    if (recv_bytes < 0) {

        perror("recvfrom failed");

        exit(EXIT_FAILURE);

    }

    buffer[recv_bytes] = '\0';

    printf("Received message: %s\n", buffer);

    close(sockfd);

    return 0;

}

这个示例代码创建了一个UDP套接字,绑定到本地地址和端口号8080。然后使用recvfrom函数接收来自客户端的数据,并将接收到的消息打印出来。

需要注意的是,在实际开发中,你可能需要根据具体需求进行错误处理、处理多次接收等情况,以保证程序的稳定性和正确性。

0