【发布时间】:2014-01-09 18:31:35
【问题描述】:
我想获取 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 端口上有一个?
更新:
我加了
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
然后我可以成功绑定套接字,但是连接会在几秒钟内无缘无故地死掉。
【问题讨论】:
-
我认为你需要一个
req.ifr_addr.sa_family = AF_INET来告诉 SIOCGIFADDR 调用你想要什么类型的地址。 -
@MarkPlotnick 不幸的是,它没有帮助!我使用了这段代码:man7.org/linux/man-pages/man3/getifaddrs.3.html,据说eth0是AF_PACKET。不知道为什么!
-
在看到您的问题的更新后,答案似乎是“当没有为接口分配 IP 地址时,SIOCGIFADDR 将失败”。对于您的新问题-为什么几秒钟后连接失败-您可能应该将此作为单独的问题发布。包括
ifconfig的输出和执行connect并传输数据的代码。我的猜测:路由器通常使用以.1结尾的地址。您选择的地址 192.168.1.1 可能已被您网络上其他地方的路由器使用。 -
@MarkPlotnick 奇怪的是,重启后问题就消失了。但我确信这与路由器无关,因为我没有连接到任何路由器。