有谁知道我如何获得我的局域网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