有誰知道我如何獲得我的局域網IP並將其打印在屏幕上。 *我不是指shell,而是c編程。 **我會很感激,如果你會張貼我的示例代碼。獲取局域網ip並打印它
1
A
回答
3
從<ifaddrs.h>
的getifaddrs()
功能是獲取當前的接口和相應的地址,最簡單的方法:
#include <stdio.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct ifaddrs *iflist, *iface;
if (getifaddrs(&iflist) < 0) {
perror("getifaddrs");
return 1;
}
for (iface = iflist; iface; iface = iface->ifa_next) {
int af = iface->ifa_addr->sa_family;
const void *addr;
char addrp[INET6_ADDRSTRLEN];
switch (af) {
case AF_INET:
addr = &((struct sockaddr_in *)iface->ifa_addr)->sin_addr;
break;
case AF_INET6:
addr = &((struct sockaddr_in6 *)iface->ifa_addr)->sin6_addr;
break;
default:
addr = NULL;
}
if (addr) {
if (inet_ntop(af, addr, addrp, sizeof addrp) == NULL) {
perror("inet_ntop");
continue;
}
printf("Interface %s has address %s\n", iface->ifa_name, addrp);
}
}
freeifaddrs(iflist);
return 0;
}
4
有幾種方法;首先,您可以使用connect(2)
建立與已知對等方的連接,然後使用getsockname(2)
讀取本地套接字「名稱」。這是一個相當差的機制,但它很容易。
但是,getsockname(2)
將只報告一個 IP地址,當一臺機器可能有上千個IP地址,並返回IP在您選擇的節點將部分取決於!所以,不是很可靠。
一個更好的答案是使用rtnetlink(7)
直接從內核讀取機器的IP地址:您將發送RTM_GETADDR
消息到機器上每個接口的內核並讀取答案。理解如何使用這個最好的選擇可能是讀取ip
程序的源代碼。
另一種選擇是在IP套接字上使用SIOCGIFCONF
ioctl(2)
。該接口不如rtnetlink(7)
接口靈活,所以它可能並不總是正確的,但它將是一箇中間點。 ifconfig(8)
實用程序使用此方法來顯示ifconfig -a
輸出。再次,你最好的選擇將是閱讀來源。 (在ioctl_list(2)
有一些輕微的文檔。)
2
gethostbyname
應該可以幫助你做到這一點。示例:
GetLocalAddress()
{
char ac[80];
// Get my host name
if (gethostname(ac, sizeof(ac)) != -1)
{
printf("Host name: %s\n", ac);
// Find IP addresses
struct hostent* p_he = gethostbyname(ac);
if (p_he != 0)
{
for (int i=0; p_he->h_addr_list[i] != 0; ++i)
{
struct in_addr addr;
memcpy(&addr, p_he->h_addr_list[i], sizeof(struct in_addr));
printf("IP address %d: %s\n", i, inet_ntoa(addr));
}
}
}
您可能需要過濾以從列表中刪除127.0.0.1。
+1
我不認爲'C編程'有`std :: cout` ;-) – Johnsyweb 2011-01-11 11:56:11
相關問題
- 1. 如何獲得IP laravel 5.1並打印?
- 2. 獲取局域網中的所有IP和Mac地址
- 3. 如何獲取局域網中的IP地址列表?
- 4. 如何在局域網中獲取外部IP地址?
- 5. 獲取局域網上的所有IP地址
- 6. Python在Ubuntu上獲取機器的局域網IP地址
- 7. 獲取我的局域網IP地址(192.168.xxxx)(IPV4)
- 8. 如何使用jsp頁面獲取局域網IP地址?
- 9. 獲取打印機的IP地址
- 10. Java - 列出局域網上的所有網絡打印機
- 11. 如何獲取打印區域範圍?
- 12. Qt5從局域網獲取mjpeg流
- 13. 獲取連接我的局域網
- 14. AFNetworking - iOS獲取JSON時,PHP打印它
- 15. 廣域網和局域網接口的IP分配:
- 16. 查找局域網IP,並使用PHP代碼
- 17. 從通用結果列表中獲取數據並打印它
- 18. 使用php domdocument獲取完整的表格並打印它
- 19. 獲取腳本文件名並打印它
- 20. 獲取一個字符並在VC++中打印它
- 21. 從IP獲取域名
- 22. 軟件接收的PrintJob並轉發給打印機在局域網
- 23. 獲取網絡打印機列表silverlight
- 24. 獲取網頁打印屏幕,php/unix
- 25. 使用IP地址打印到網絡打印機
- 26. 從局域網中的主機名獲得IP地址
- 27. undef值並打印它
- 28. 通過背景工作控制在局域網上獲取IP地址
- 29. 如何使用NSHost獲取一堆局域網IP地址的名字?
- 30. 您可以通過JavaScript獲取用戶本地局域網IP地址嗎?
感謝..你知道我在哪裏可以找到示例代碼..? – azulay7 2011-01-11 11:27:37
`getifaddrs()`是一個更易於使用的界面(它使用下面的netlink)。 – caf 2011-01-12 09:30:40