recvfrom函數(shù)是Linux系統(tǒng)提供的用于接收數(shù)據(jù)的網(wǎng)絡(luò)函數(shù)之一。它常用于從一個(gè)已經(jīng)建立好的套接字(socket)中接收數(shù)據(jù)。
下面是recvfrom函數(shù)的基本語法:
#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);
參數(shù)說明:
sockfd:套接字描述符,即需要從該套接字接收數(shù)據(jù)。
buf:指向接收緩沖區(qū)的指針,用于存儲接收到的數(shù)據(jù)。
len:接收緩沖區(qū)的大小,即可以接收的最大字節(jié)數(shù)。
flags:接收操作的標(biāo)志,一般可以設(shè)置為0。
src_addr:指向發(fā)送方地址結(jié)構(gòu)體的指針。在接收數(shù)據(jù)時(shí),該參數(shù)會被填充為發(fā)送方的地址信息。
addrlen:發(fā)送方地址結(jié)構(gòu)體的長度,在函數(shù)調(diào)用前需要將其初始化為發(fā)送方地址結(jié)構(gòu)體的實(shí)際長度。
返回值:
-1:表示接收數(shù)據(jù)出錯(cuò)。
0:表示對端已關(guān)閉連接。
大于0:表示實(shí)際接收到的字節(jié)數(shù)。
下面是一個(gè)簡單的示例,展示了如何使用recvfrom函數(shù)接收UDP套接字中的數(shù)據(jù):
#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];
// 創(chuàng)建套接字
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);
}
// 接收數(shù)據(jù)
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;
}
這個(gè)示例代碼創(chuàng)建了一個(gè)UDP套接字,綁定到本地地址和端口號8080。然后使用recvfrom函數(shù)接收來自客戶端的數(shù)據(jù),并將接收到的消息打印出來。
需要注意的是,在實(shí)際開發(fā)中,你可能需要根據(jù)具體需求進(jìn)行錯(cuò)誤處理、處理多次接收等情況,以保證程序的穩(wěn)定性和正確性。