2011-11-18 46 views
12

Có cách nào để ping một địa chỉ IP cụ thể với C? Nếu tôi muốn ping "www.google.com" với một số lượng ping nhất định, hoặc cho vấn đề đó, một địa chỉ cục bộ, tôi sẽ cần một chương trình để làm điều đó. Làm thế nào tôi có thể ping từ C?Có cách nào để ping một địa chỉ IP cụ thể với C?

+0

Sử dụng API 'socket' (' man socket'). –

+0

Tại sao bạn muốn ping Google, giả sử bạn không làm việc cho Google? – dbasnett

+0

Đây là hệ điều hành cụ thể. Và 'www.google.com' không phải là địa chỉ IP (nhưng' 192.168.2.34' là một). –

Trả lời

3

Bạn sẽ phải tìm hiểu ổ cắm, giải quyết máy chủ bạn muốn ping, gửi gói ICMP thích hợp và lắng nghe phản hồi. Không có hàm ping trong thư viện chuẩn. Tuy nhiên, có rất nhiều thư viện mạng cấp cao hơn đã triển khai giao thức.

9

Bạn có thể phác thảo của riêng ICMP packets sử dụng raw sockets, nhưng đó là xa tầm thường. Các source code for ping(1) là một nơi tốt để bắt đầu tìm ra cách để làm điều đó (nó sử dụng một giấy phép giống như BSD; xem mã nguồn cho giấy phép đầy đủ). Hãy nhớ rằng các socket thô yêu cầu các đặc quyền root trên Linux, vì vậy chương trình của bạn sẽ cần phải được thiết lập root.

Tất nhiên, sẽ dễ dàng hơn khi xuất hiện trong tệp thực thi ping(1) và không phải tự mình xử lý. Bạn sẽ không phải lo lắng về việc cấp phép mã, và chương trình của bạn sẽ không cần quyền root (giả sử nó không cần chúng cho cái gì khác). system(3), popen(3)fork(3)/exec(3) là bạn của bạn.

+0

Tôi muốn bạn đã đưa ra một giải thích tốt hơn về phương pháp hệ thống/exec ping. Điều này sẽ cực kỳ hữu ích. – CaptainBli

10

Hiện chưa có câu trả lời được chấp nhận và tôi tình cờ gặp câu hỏi này trong khi cố gắng làm chính xác những gì được hỏi ở đây vì vậy tôi muốn tham khảo Aif's câu trả lời here.
Mã sau đây dựa trên ví dụ của anh ấy và ping DNS công khai của Google trong một tiến trình con và in kết quả đầu ra trong quy trình gốc.

#include <sys/wait.h> 
#include <unistd.h> 
#include <stdio.h> 

#define BUFLEN 1024 

int main(int argc, char **argv) 
{ 
    int pipe_arr[2]; 
    char buf[BUFLEN]; 

    //Create pipe - pipe_arr[0] is "reading end", pipe_arr[1] is "writing end" 
    pipe(pipe_arr); 

    if(fork() == 0) //child 
    { 
     dup2(pipe_arr[1], STDOUT_FILENO); 
     execl("/sbin/ping", "ping", "-c 1", "8.8.8.8", (char*)NULL);  
    } 
    else //parent 
    { 
     wait(NULL); 
     read(pipe_arr[0], buf, BUFLEN); 
     printf("%s\n", buf); 

    } 

    close(pipe_arr[0]); 
    close(pipe_arr[1]); 
    return 0; 
} 
Các vấn đề liên quan