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)。返回值:
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()
以持續接收數據。