在C++中,获取本地计算机的IP地址和子网掩码的最简单方法是什么?
我希望能够在本地网络中检测本地计算机的IP地址.在我的特定情况下,我有一个子网掩码为255.255.255.0的网络,我的计算机的IP地址是192.168.0.5.我需要以编程方式获取这两个值,以便向我的网络发送广播消息(对于我的特定情况,格式为192.168.0.255)
编辑:许多答案没有给出我预期的结果,因为我有两个不同的网络IP.Torial的代码完成了这个伎俩(它给了我两个IP地址).谢谢.
编辑2:感谢Brian R. Bondy提供有关子网掩码的信息.
我无法解决这个问题 - 我正在使用本指南使用C语言中的套接字 - http://binarii.com/files/papers/c_sockets.txt
我正在尝试自动获取我的ip和端口使用:
server.sin_port = 0; /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY; /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function
Run Code Online (Sandbox Code Playgroud)
成功绑定后,如何找出实际分配的IP和端口?
我想获取我的程序启动的计算机的IP地址,然后能够将其发送到客户端,但我总是得到0.0.0.1而不是真正的IP地址(例如127.0.0.1).
我目前能够获得端口,但不能获得IP地址.
我怎么才能得到它?
最好的解决方案是能够获得它sockaddr_in.这是我目前正在做的事情:
int open_connection(char* ip, int* port)
{
int sock;
struct sockaddr_in sin;
socklen_t len;
int i;
i = 0;
len = sizeof(sin);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return (-1);
bzero(&sin, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) != 0)
perror("Error on bind");
if (getsockname(sock, (struct sockaddr *)&sin, &len) != 0)
perror("Error on getsockname");
strcpy(ip, inet_ntoa(sin.sin_addr)); // IP = 0.0.0.0
*port = sin.sin_port;
return (sock);
}
Run Code Online (Sandbox Code Playgroud)
编辑:我理解我用我的思维方式走错了方向.所以我的问题是:获取自己的IP地址的最佳方法是什么?
可能重复:
Linux/C++:获取本地计算机的IP地址
我试图获取本地计算机的所有接口的IP和MAC地址,但我不能真正成功.我需要把它放在一起,所以我知道哪个IP属于哪个MAC.
我在google上进行了很多搜索,甚至在这里,但是我找不到真正的C代码.
请你帮助我好吗?
提前致谢!我真的很感激!
我正在关注关于NP的Beej指南.
我做了一些修改,并试图通过getaddrinfo()获取我的服务器程序的IP.
(原文可在此处找到http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#simpleserver)
以下是我更改/添加的部分.
if ((rv = getaddrinfo(NULL, "0", &hints, &servinfo)) != 0) { //0 for random port?
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
//... some code emitted ...
//freeaddrinfo(servinfo); //I still need it!
printf("ip: %s\nport: %d\n",
inet_ntop(AF_INET, &((struct sockaddr_in *)p->ai_addr)->sin_addr, ip4, INET_ADDRSTRLEN),
ntohs(((struct sockaddr_in *)p->ai_addr)->sin_port)
);
Run Code Online (Sandbox Code Playgroud)
问题是我得到了结果
ip: 0.0.0.0
port: 0
Run Code Online (Sandbox Code Playgroud)
Q1:我从几个网站上读到,为端口设置"0"告诉操作系统你想要下一个可用端口,而不是实际为0.这是真的吗?
Q2:我还读过gethostbyname(gethostname(...))可以给你机器的ip,但是Beej说这些被getaddrinfo()取代了.那么,我应该使用getaddrinfo吗?还是gethostbyname?
问题3:还有什么我做错了吗?
在Linux机器上,通用接口名称看起来像eth0,eth1等.我知道如何使用gethostbyname或类似功能找到至少一个IP地址,但我不知道如何指定哪个命名接口我想要IP地址的.我可以使用ifconfig并解析输出,但是为这些信息进行炮轰似乎......不优雅.
有没有办法将所有接口及其IP地址(以及可能的MAC地址)枚举到集合中?或者至少是某些东西gethostbyinterface("eth0")?
我用这个作为地址来创建一个新的服务器(socket(),bind(),listen()):
struct sockaddr_in newServer;
memset(&newServer, 0, sizeof(newServer));
newServer.sin_family = AF_INET;
newServer.sin_addr.s_addr = htonl(INADDR_ANY);
newServer.sin_port = htons(UNUSED_PORT);
Run Code Online (Sandbox Code Playgroud)
宏UNUSED_PORT定义为0.
我期望让服务器监听任何接口和未使用的端口.
我试图用来getsockname()获取我的本地IP地址和端口,但我得到了一些奇怪的输出.输出代码如下:
struct sockaddr_in localAddress;
socklen_t addressLength;
getsockname(newServerfd, (struct sockaddr*)&localAddress, \
&addressLength);
printf("local address: %s\n", inet_ntoa( localAddress.sin_addr));
printf("local port: %d\n", (int) ntohs(localAddress.sin_port));
Run Code Online (Sandbox Code Playgroud)
例如,我得到0.255.255.255:0,0.0.0.0:0,255.127.0.0:36237等,我的系统是Mac OS X 10.7.3.
--update--
使用后socklen_t addressLength = sizeof(localAddress);(感谢@cnicutar和@Jonathan Leffler),我总是得到0.0.0.0的本地IP; 那好吗?
我正在用C++编写一个使用网络套接字的程序.我需要知道计算机的IP地址是什么,所以我可以将它显示给用户.该程序必须在Windows和Linux上运行.
我听说过计算机可以有多个IP地址.我希望不同计算机上的其他程序可以用来连接到计算机.
这是我已经拥有的相关代码(变量在其他地方声明):
master = new fd_set;
FD_ZERO(master);
struct sockaddr_in my_addr;
listener = socket(PF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
bind(listener, (struct sockaddr *)&my_addr, sizeof my_addr);
listen(listener, 10);
FD_SET(listener, master);
fdmax = listener;
Run Code Online (Sandbox Code Playgroud) 在这里的答案中建议,获取机器的IP地址,可以getifaddrs()用来获取程序运行的机器的IP地址,这很有效:D:D
但是,在两个不同的系统上运行相同的程序,一个显示
SERVER_ADDRESS lo 127.0.0.1
SERVER_ADDRESS eth0 129.xxx.xxx.xxx
SERVER_ADDRESS virbr0 192.zzz.zzz.1
Run Code Online (Sandbox Code Playgroud)
而另一个显示
SERVER_ADDRESS lo0 127.0.0.1
SERVER_ADDRESS en0 192.yyy.yyy.yyy
Run Code Online (Sandbox Code Playgroud)
我打算用来strcmp区分以太网,但现在我意识到它不能跨系统工作,因为可能会打印出不同的字符串.
是否有功能(或更好的方法)来检查是否ifa_name是以太网?
c ×7
linux ×6
sockets ×6
c++ ×4
networking ×4
ip-address ×3
ip ×1
mac-address ×1
port ×1
tcp ×1
unix ×1