我想获得eth0的IP。这是我写的(也许有办法解决它?):
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);
我收到以下错误:
[错误](src / server / server.c:43:errno:无法分配请求的地址)SIOCGIFADDR失败
如果我使用与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 / network / interfaces并重新启动网络并取得了一些进展:
DEBUG src/server/server.c:50: serverip: 192.168.1.1
然后我可以成功绑定套接字,但连接在几秒钟内无缘无故死亡。
答案 0 :(得分:1)
由于我一直在寻找原始问题的答案,因此我将根据提出问题的人的进一步研究,正式写出马克·普洛特尼克(Mark Plotnick)在上面给出的答案,作为评论。
SIOCGIFADDR失败,如果没有地址分配给接口,则errno设置为EADDRNOTAVAIL。正如原始发问者所发现的那样,要阻止它失败,请设置接口的IP地址。
strerror()将EADDRNOTAVAIL转换为“无法分配请求的地址”,这会误导您在这种情况下读取地址而不分配地址的错误。
答案 1 :(得分:0)
几年前我使用过这段代码。这应该有所帮助。
#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;
}
答案 2 :(得分:0)
我想获取eth0的IP
改为使用getifaddrs。
ifaddrs* pList = NULL;
ifaddrs* pAdapter = NULL;
ifaddrs* pAdapterFound = NULL;
const char* pszAdapterName = "eth0";
int family = AF_INET; // can be AF_INET6 if you want ipv6
int result = getifaddrs(&pList);
if (result > 0)
{
pAdapter = pList;
while (pAdapter)
{
if ((pAdapter->ifa_addr != NULL) && (pAdapter->ifa_name != NULL) && (family == pAdapter->ifa_addr->sa_family))
{
if (strcmp(pAdapter->ifa_name, pszAdapterName) == 0)
{
pAdapterFound = pAdapter;
break;
}
}
pAdapter = pAdapter->ifa_next;
}
if (pAdapterFound)
{
if (family == AF_INET)
{
sockaddr_in addr4 = *(sockaddr_in*)(pAdapter->ifa_addr);
}
else if (family == AF_INET6)
{
sockaddr_in6 addr6 = *(sockaddr_in6*)(pAdapter->ifa_addr);
}
}
if (pList)
{
freeifaddrs(pList);
pList = NULL;
}
}