- コンパイラ: コード::ブロック (GNU GCC)
- プラットフォーム: Windows(x86)
- インクルード: winsock.h winsock2.h (ws2_32 もリンクされています)
私は現在、IP アドレスのリストを含むテキスト ファイルを読み取り、各 IP アドレスにそれぞれ ping を実行するプログラムを作成しようとしています。ホストが ping に応答すると、ホストの IP アドレスが、ユーザーが指定した 2 番目のファイルにコピーされます。残念なことに、C のソケット ライブラリを使用したのはこれが初めてで、C を使用して ping を実行する方法についての適切なチュートリアルが見つかりません。ICMP タイプ、コード、およびチェックサムを含む構造体である ICMP ヘッダーを IP データグラムに含める必要があります。しかし、どうすればいいのかわかりません。構造体を自分で宣言する必要がありますか、それともヘッダーファイルで宣言されていますか? 私はそれがヘッダーにあると仮定していますが、チュートリアルはそれが宣言されている正確な場所について互いに矛盾しています。icmp.h と netinet/icmp を含めて疲れました。
struct echo_request
{
char type; // Type
char code; // Code
short checksum; // Checksum
short id; // Identification
short seq; // Sequence
int time; // Time
char data[16]; // Data
};
私はそれを回避できるかもしれないと思っていましたが、コンパイラが in_cksum()(checksum generator) が未定義であると言っているため、プログラムをコンパイルすることさえできませんでした。
質問をまとめると、どのヘッダー ファイルを含める必要があるか、ping パケットを作成するにはどうすればよいか、正しいチェックサム ジェネレーター関数を使用しているか、ping をポート 80 に送信する必要があるか、使用するソケットは RAW または DGRAM にする必要がありますか?
これは私がこれまでに持っているものです。意図的にエラーチェックを省略していることに注意してください。
int socket_descriptor = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
struct sockaddr_in address; //Initialize address struct
memset(&address, 0, sizeof(address)); //Clear address struct
//Declare address
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ipaddress);
address.sin_port = htons(80);
//Bind socket to address
bind(socket_descriptor, (struct sockaddr *)&address, sizeof(address));
//Create packet
struct echo_request packet; //See above for declaration of struct
memset(packet.data, 1, 16);
packet.type = 8; //ECHO_REQUEST
packet.code = 0;
packet.time = gettime();
packet.checksum = 0;
packet.checksum = in_cksum(packet, sizeof(packet));