【C言語】pingを自作する方法を解説

この記事では、C言語を使用してpingを送信するプログラムを作成する手順を解説します。

目次から探す

C言語でのping送信プログラムの作成手順

C言語を使用して、pingを送信するプログラムを作成する手順を解説します。

以下の手順に従って進めてください。

ライブラリのインクルード

まず、必要なライブラリをインクルードします。

以下のコードをプログラムの先頭に追加します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <arpa/inet.h>

かなり多いので、余裕があればプリコンパイルヘッダなどを使って最適化するといいでしょう。

ソケットの作成

次に、ソケットを作成します。

ソケットは通信のためのエンドポイントです。

以下のコードを追加します。

int sockfd;
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sockfd < 0) {
    perror("socket");
    exit(1);
}

ICMPパケットの作成

次に、ICMPパケットを作成します。

ICMPパケットはpingの送受信に使用されます。

以下のコードを追加します。

struct icmphdr icmp;
memset(&icmp, 0, sizeof(struct icmphdr));
icmp.type = ICMP_ECHO;
icmp.code = 0;
icmp.checksum = 0;
icmp.un.echo.id = getpid();
icmp.un.echo.sequence = 1;

ICMPパケットの送信

作成したICMPパケットを送信します。

以下のコードを追加します。

struct sockaddr_in dest_addr;
memset(&dest_addr, 0, sizeof(struct sockaddr_in));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 送信先のIPアドレスを指定
int send_result = sendto(sockfd, &icmp, sizeof(struct icmphdr), 0, (struct sockaddr*)&dest_addr, sizeof(struct sockaddr_in));
if (send_result < 0) {
    perror("sendto");
    exit(1);
}

ICMPパケットの受信

送信したICMPパケットの応答を受信します。

以下のコードを追加します。

struct sockaddr_in recv_addr;
socklen_t recv_addr_len = sizeof(struct sockaddr_in);
unsigned char recv_buf[1024];
int recv_result = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&recv_addr, &recv_addr_len);
if (recv_result < 0) {
    perror("recvfrom");
    exit(1);
}

応答の解析

受信したICMPパケットの応答を解析します。

以下のコードを追加します。

struct iphdr* ip = (struct iphdr*)recv_buf;
struct icmphdr* icmp_reply = (struct icmphdr*)(recv_buf + (ip->ihl * 4));
if (icmp_reply->type == ICMP_ECHOREPLY) {
    printf("Ping succeeded!\n");
} else {
    printf("Ping failed!\n");
}
1 2

この記事のページ一覧
  1. 現在のページ
目次から探す