2013-01-13 30 views
6
  • 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)); 
+0

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)? –

Trả lời

3

Nếu bạn không phải thực hiện ping từ đầu và bạn chỉ muốn giải pháp Windows, tôi sẽ đề nghị thứ hai của Anton cho IcmpSendEcho. Nếu bạn phải thực hiện ping, hãy xem cách POCO gói ICMP được triển khai như thế nào. Đó là mã di động và nó chạy tốt trên Windows.

Liên quan đến câu hỏi cụ thể, đây là những câu trả lời:

những tập tin tiêu đề tôi nên bao gồm

#include <winsock2.h> 

làm thế nào để tạo ra một gói ping

Xem ICMPv4PacketImpl::initPacket() để biết ví dụ về IPv4 pa cket.

Tôi là sử dụng chức năng máy phát điện checksum đúng

Không cho các cửa sổ. Xem ICMPPacketImpl::checksum() để biết ví dụ về hàm tổng kiểm tra.

một ping nên được chuyển tới cổng 80

số Không có những điều như cổng khi nói đến ICMP. Xem Does ICMP use a specific port?

nên các ổ cắm tôi sử dụng được RAW hoặc DGRAM

Nó phải là RAW.

+0

Cảm ơn bạn đã trả lời rất nhiều thông tin và hữu ích. –

2

Dường như bạn muốn một giải pháp thực sự, không chỉ thực hiện lại PING vì lợi ích của nó.

tôi khuyên bạn nên sử dụng IP helper (ICMP.dll trên các hệ thống WinXP trước), cụ thể, IcmpSendEcho (hoặc các phiên bản của nó được tăng cường, IcmpSendEcho2, IcmpSendEcho2Ex, cho các hoạt động không đồng bộ).

Có một ví dụ hoàn chỉnh về "ping" một máy chủ lưu trữ trên MSDN. Nó có thể là một điểm khởi đầu tốt.

Cập nhật: cho GCC (mingw), liên kết với -liphlpapi.

+0

Cảm ơn bạn đã trả lời. Tôi biết IcmpSendEcho nhưng tôi muốn thực hiện một giải pháp tương đối di động. –

Các vấn đề liên quan