如何防止SIOCGIFADDR失效?
我想获取eth0的IP。这是我写的东西(也许有办法解决它?):如何防止SIOCGIFADDR失效?
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
check(sockfd > 0, "cannot create socket\n");
#define INTERFACE_NAME "eth0"
#define INTERFACE_NAME_LENGTH 4
char *opt = INTERFACE_NAME;
rc = setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, opt, INTERFACE_NAME_LENGTH);
check(rc == 0, "BINDTODEVICE failed");
struct ifreq req;
strncpy(req.ifr_name, INTERFACE_NAME, IFNAMSIZ);
rc = ioctl(sockfd, SIOCGIFADDR, (unsigned long)&req);
check(rc == 0, "SIOCGIFADDR failed");
server_ip = ((struct sockaddr_in*)&req.ifr_addr)->sin_addr.s_addr;
char str[50];
inet_ntop(AF_INET, &(server_ip), str, INET_ADDRSTRLEN);
debug("serverip: %s", str);
return sockfd;
error:
if (sockfd) close(sockfd);
exit(1);
我得到以下错误:
[ERROR] (src/server/server.c:43: errno: Cannot assign requested address) SIOCGIFADDR failed
如果我用为wlan0同样的方法,我得到了什么我期望看到。
这里是netstat的输出:
netstat的-tulpn:
Proto | Local Address | PID
udp | 0.0.0.0:16313 | 4666/dhclient
udp | 0.0.0.0:68 | 4687/dhclient
udp | 0.0.0.0:68 | 4666/dhclient
所以,我想,我不能指定,因为dhclients的地址?为什么有这么多人?为什么在16313端口上有一个?
UPD:
我加
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
到/ etc /网络/接口,并重新启动联网并得到了一些进展:
DEBUG src/server/server.c:50: serverip: 192.168.1.1
,然后我可以成功绑定插座,但连接在几秒钟内无故死亡。
几年前,我曾经使用过这段代码。这应该有所帮助。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <unistd.h>
#include <arpa/inet.h>
int main()
{
int sock;
struct ifreq ifr;
char ifname[10] = "eth0";
sock = socket(AF_INET, SOCK_STREAM, 0);
//Type of address to retrieve - IPv4 IP address
ifr.ifr_addr.sa_family = AF_INET;
//Copy the interface name in the ifreq structure
strncpy(ifr.ifr_name , ifname , 30);
ioctl(sock, SIOCGIFADDR, &ifr);
close(fd);
//display result
printf("%s - %s\n" , iface , inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
return 0;
}
与我上面张贴的不一样吗? – staroselskii
作为其他人指出上面你已经错过了这条线req.ifr_addr.sa_family = AF_INET –
正如我上面写的那样,这条线没有帮助:-( – staroselskii
我想你需要'req.ifr_addr.sa_family = AF_INET'来告诉SIOCGIFADDR调用你想要的是什么类型的地址。 –
@MarkPlotnick不幸的是,它没有帮助!我使用了这段代码:man7.org/linux/man-pages/man3/getifaddrs.3.html,据说eth0是AF_PACKET。不知道为什么! – staroselskii
看到您的问题的更新后,答案似乎是“没有分配给接口的IP地址时,SIOCGIFADDR将失败”。对于您的新问题 - 为什么几秒钟后连接失败 - 您应该将其作为单独的问题发布。包含'ifconfig'的输出和执行'connect'并传输数据的代码。我的猜测是:一个以'.1'结尾的地址通常被路由器使用。您选择的地址192.168.1.1可能已经被网络中其他地方的路由器使用。 –