導入:
ネットワーク通信において、UDP (User Datagram Protocol) は、高速で効率的なデータ送信方法を提供するコネクションレス型プロトコルです。この記事では、UDP メッセージを受信するためのコードを C 言語で記述する方法を説明します。
ステップ:
ステップ 1: ソケットを作成する
まず、UDP 通信用のソケットを作成する必要があります。この関数を使用して IPv4 ソケットを作成できますsocket()
。サンプル コードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd;
struct sockaddr_in serverAddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888); // 指定UDP监听端口
serverAddr.sin_addr.s_addr = INADDR_ANY;
// 将套接字与服务器地址绑定
if (bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
perror("Binding failed");
exit(EXIT_FAILURE);
}
// 在这里可以开始接收消息
// ...
close(sockfd);
return 0;
}
ステップ 2: メッセージを受信する
次に、関数を使用してrecvfrom()
ソケットから UDP メッセージを受信します。サンプルコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
// 之前的代码...
char buffer[1024];
struct sockaddr_in clientAddr;
socklen_t addrLen = sizeof(clientAddr);
while (1) {
memset(buffer, 0, sizeof(buffer));
// 接收消息
ssize_t recvSize = recvfrom(sockfd, buffer, sizeof(buffer)-1, 0,
(struct sockaddr*)&clientAddr, &addrLen);
if(recvSize < 0) {
perror("Receiving failed");
exit(EXIT_FAILURE);
}
buffer[recvSize] = '\0';
// 处理接收到的消息
printf("Received message: %s\n", buffer);
}
// 之后的代码...
return 0;
}
ステップ 3: 完了
これで、C 言語で UDP メッセージを受信するためのコードが完成しました。特定のアプリケーションのニーズを満たすために、必要に応じてコードをさらに拡張および最適化できます。
関数と変数の説明
C 言語を使用して UDP メッセージ受信コードを記述する場合、必要な機能を実現するためにいくつかの変数を定義し、いくつかの関数を使用する必要があります。以下に、これらの変数と関数について詳しく説明します。
変数:
-
sockfd
: 整数型、ソケット記述子。ソケットを識別するために使用される一意の整数。ソケットを作成した後、この変数を使用してバインド、受信などのソケット操作を実行します。 -
serverAddr
:struct sockaddr_in
タイプ、サーバーアドレス構造。サーバーのアドレスとポート情報が含まれます。特定の UDP メッセージをリッスンするには、ソケットをこのアドレスにバインドする必要があります。 -
buffer
: 受信した UDP メッセージを保存するために使用される文字配列。buffer
メッセージを受信後、さらなる処理のために保存します。 -
clientAddr
:struct sockaddr_in
タイプ、クライアント アドレス構造。UDP メッセージを受信するために関数が呼び出されるときrecvfrom()
、メッセージを送信したクライアントのアドレス情報が保存されます。 -
addrLen
: socklen_t タイプ、アドレス構造体長。recvfrom()
関数を呼び出すときは、アドレス構造体のサイズを渡す必要があります。
関数:
-
socket()
: ソケット関数を作成します。アドレス ファミリとして AF_INET、ソケット タイプとして SOCK_DGRAM、デフォルト プロトコルとして 0 を使用してソケットを作成します。作成に失敗した場合は、-1 が返されます。 -
bind()
: バインド関数。作成されたソケットを指定されたサーバー アドレスにバインドします。バインディングが失敗した場合は、-1 が返されます。 -
recvfrom()
:受信機能。ソケットから UDP メッセージを受信し、提供されたバッファに格納します。clientAddr
また、メッセージの送信元のアドレス情報を提供するための構造体も設定されます。受信に失敗した場合は-1を返します。 -
printf()
:標準出力機能。受信したメッセージをコンソールに出力するために使用されます。 -
memset()
:メモリ設定機能。バッファ内のデータを 0 に初期化するために使用されます。メッセージを受信する前に、バッファが空であることを確認する必要があります。 -
perror()
:エラーメッセージの印刷機能。関連するエラー メッセージを標準エラー ストリームに出力できます。ソケット操作でエラーが発生した場合、エラーの原因を出力するために使用できます。 -
exit()
:機能を終了します。致命的なエラーが発生した場合、この関数を呼び出してプログラムの実行を終了できます。
これらの変数と関数を使用すると、ソケットの作成、アドレスのバインド、メッセージの受信、およびさらなる処理を行うことができます。これらを正しく使用することで、UDP メッセージを受信する機能を実現できます。
要約:
この記事では、UDP メッセージ受信を実装するコードを C 言語で記述する方法を説明します。ソケットを作成し、recvfrom()
メッセージを受信する関数を利用することで、独自のプログラムにUDP通信機能を簡単に実装できます。これがお役に立てば幸いです! ご質問等ございましたらお気軽にどうぞ。