C++中recvfrom函数如何使用

   2024-09-30 4620
核心提示:recvfrom() 是一个在 C++ 中用于从套接字(socket)接收数据的函数,该函数通常用于无连接的套接字类型,如 UDP以下是 recvfrom(

recvfrom() 是一个在 C++ 中用于从套接字(socket)接收数据的函数,该函数通常用于无连接的套接字类型,如 UDP

以下是 recvfrom() 函数的基本用法:

#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len);

参数说明:

socket: 已经创建并绑定的套接字文件描述符。buffer: 指向用于接收数据的缓冲区的指针。length: 接收缓冲区的大小。flags: 接收操作的标志,通常为 0。address: 指向存储发送方地址信息的 sockaddr 结构体的指针。address_len: 发送方地址结构体的大小,通常为 sizeof(sockaddr_in)(对于 IPv4)或 sizeof(sockaddr_in6)(对于 IPv6)。

返回值:

成功时,返回接收到的字节数。失败时,返回 -1,并设置 errno

以下是一个简单的示例,展示了如何使用 recvfrom() 函数接收 UDP 数据:

#include<iostream>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#include <cstring>int main() {    int sockfd;    struct sockaddr_in server_addr, client_addr;    socklen_t client_addr_len = sizeof(client_addr);    char buffer[1024];    // 创建套接字    sockfd = socket(AF_INET, SOCK_DGRAM, 0);    if (sockfd == -1) {        std::cerr << "Error creating socket"<< std::endl;        return 1;    }    // 配置服务器地址    mEMSet(&server_addr, 0, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);    server_addr.sin_port = htons(8080);    // 绑定套接字    if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {        std::cerr << "Error binding socket"<< std::endl;        close(sockfd);        return 1;    }    // 接收数据    ssize_t received = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_addr_len);    if (received == -1) {        std::cerr << "Error receiving data"<< std::endl;        close(sockfd);        return 1;    }    // 输出接收到的数据    std::cout << "Received: "<< buffer<< std::endl;    // 关闭套接字    close(sockfd);    return 0;}

这个示例创建了一个 UDP 套接字,将其绑定到本地地址和端口 8080,然后使用 recvfrom() 函数接收数据。请注意,此示例仅接收一次数据,实际应用程序可能需要在循环中调用 recvfrom() 以持续接收数据。

 
举报打赏
 
更多>同类维修大全
推荐图文
推荐维修大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号