如何防止SIOCGIFADDR失败?

 龙帅1314的爱_530 发布于 2023-02-04 18:57

我想得到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

然后我可以成功绑定套接字,但连接在几秒钟内无缘无故死亡.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有