Linux の recvfrom 関数の使い方
recvfrom関数は、Linuxシステムで提供されているデータを受け取るネットワーク関数の一つです。通常、すでに確立済みのソケットからデータを受け取るために使用されます。
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: 受け取りバッファのサイズ。受信可能な最大バイト数。
フラグ: 受け取る操作のフラグ(通常は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関数を使用してクライアントからのデータを受信し、受信したメッセージを出力します。
現実の開発では、プログラムの安定性と正確性を確保するために、错误処理、複数回の受信処理など、具体的なニーズに応じて対処する必要がある。