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?
Trả lời
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.
Đây chỉ là đơn giản nhất tôi tìm thấy.
http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/commands/simple/ping.c
Làm cách nào để xác định các tệp net/gen? Chúng dường như không có sẵn khi tôi thử và biên dịch! –
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)
và fork(3)
/exec(3)
là bạn của bạn.
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
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;
}
- 1. Cách ping địa chỉ IP bằng cách sử dụng JavaScript
- 2. expressjs Bind đến một địa chỉ IP cụ thể
- 3. Ping một dải IP với Scapy
- 4. Địa chỉ IP C++ Dạng người có thể đọc được
- 5. làm thế nào để ping địa chỉ ip trong php và cho kết quả
- 6. Ping một địa chỉ IP bằng cách sử dụng PHP và lặp lại kết quả
- 7. Cách kiểm tra xem địa chỉ IP có nằm trong một mạng con cụ thể không
- 8. Vấn đề ping một địa chỉ URL từ C#
- 9. Làm cách nào để lấy địa chỉ vật lý (MAC) của địa chỉ IP bằng C#?
- 10. Cách tạo trang web chỉ có thể mở từ một địa chỉ IP được chỉ định
- 11. Python: Nhận địa chỉ IP cục bộ được sử dụng để gửi dữ liệu IP đến một địa chỉ IP từ xa cụ thể
- 12. Làm cách nào để đặt địa chỉ IP cho giao diện TUN trên OSX (không có địa chỉ đích)?
- 13. Số nguyên cho Địa chỉ IP - C
- 14. Mở một địa chỉ cụ thể
- 15. Có cách nào để khám phá địa chỉ IP nào được kết nối với db không?
- 16. Ping từ một chương trình C/C++
- 17. Cách lấy địa chỉ IP tăng :: asio :: ip :: tcp :: socket?
- 18. Cách so sánh dải địa chỉ IP trong C#?
- 19. Chứng chỉ SSL có bị ràng buộc với địa chỉ IP của máy chủ không?
- 20. Cách xác thực địa chỉ IP trong C#
- 21. Làm cách nào để nhận địa chỉ IP?
- 22. Làm cách nào để chỉ định địa chỉ IP với trình kiểm tra Django?
- 23. Cần có một điều khiển địa chỉ IP WinForms .NET
- 24. Giới hạn truy cập dịch vụ web asmx đối với các địa chỉ IP cụ thể
- 25. Gửi Yêu cầu SOAP từ một địa chỉ IP cụ thể
- 26. Cách nghe trên nhiều địa chỉ IP?
- 27. Chuyển đổi [địa chỉ NSNetservice] để ip địa chỉ chuỗi
- 28. Kết nối IIS Express với một Địa chỉ IP
- 29. Có ai biết một thành phần java để kiểm tra xem địa chỉ IP là từ mạng cụ thể/netmask?
- 30. Tôi có thể cấm địa chỉ IP (hoặc một dải địa chỉ) trong ứng dụng ASP.NET không?
Sử dụng API 'socket' (' man socket'). –
Tại sao bạn muốn ping Google, giả sử bạn không làm việc cho Google? – dbasnett
Đâ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). –