- Compiler: Code :: Blocks (GNU GCC)
- Hệ điều hành: Windows (x86)
- Bao gồm: winsock.h winsock2.h (ws2_32 được liên kết cũng)
Tôi hiện đang cố gắng viết chương trình sẽ đọc tệp văn bản chứa danh sách địa chỉ IP và ping từng địa chỉ IP tương ứng. Nếu máy chủ phản hồi ping thì địa chỉ IP của máy chủ sẽ được sao chép vào tệp được chỉ định bởi người dùng. Unfourtantly đây là lần đầu tiên tôi đã sử dụng thư viện socket của C và tôi không thể tìm thấy một hướng dẫn tốt về cách ping bằng cách sử dụng C. Từ những gì tôi hiểu về các hướng dẫn cặp vợ chồng tôi đã tìm thấy. Tôi cần bao gồm một tiêu đề ICMP, là một cấu trúc liên quan đến loại ICMP, mã, và tổng kiểm tra, trong một gói dữ liệu IP. Nhưng tôi không có ý tưởng làm thế nào để đi về làm như vậy, tôi nên tuyên bố cấu trúc bản thân mình hoặc là nó tuyên bố trong một tập tin tiêu đề? Tôi giả định rằng nó là một tiêu đề nhưng các hướng dẫn mâu thuẫn với nhau về chính xác nơi nó được khai báo. Tôi mệt mỏi bao gồm icmp.h và netinet/icmp.h nhưng trình biên dịch của tôi phàn nàn rằng họ không tồn tại nên tôi đã tạo cấu trúc của riêng mình.Làm thế nào để Ping Sử dụng Sockets Thư viện - C
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
};
Tôi nghĩ rằng tôi có thể có thể nhận được ngay với nó nhưng tôi thậm chí còn không thể biên dịch chương trình của tôi bởi vì trình biên dịch của tôi nói rằng in_cksum() (checksum máy phát điện) là không xác định. Để tổng hợp các câu hỏi của tôi, tôi nên bao gồm các tệp tiêu đề nào, làm cách nào để tạo gói ping, tôi có sử dụng chức năng phát hiện kiểm tra chính xác hay không, nên ping được chuyển hướng đến cổng 80 và ổ cắm tôi sử dụng phải RAW hoặc DGRAM?
Đây là những gì tôi có cho đến nay, xin lưu ý rằng tôi đã cố ý bỏ qua kiểm tra lỗi.
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));
1) cấu trúc phải được đóng gói, đảm bảo rằng trình biên dịch không căn chỉnh các trường 2) Windows có hỗ trợ ổ cắm thô tốt không (Tôi không biết điều này)? –