下面的代码是用国内的chatgpt镜像地址写出的代码,可以编译通过,但是运行错误,大家看看:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <arpa/inet.h>
#include <net/if.h>
#define BUF_SIZE 4096
int main(int argc, char **argv) {
int ifIndex;
struct in_addr addr;
uint32_t prefixLen;
if (argc != 3) {
fprintf(stderr, "Usage: %s <ifname> <address/prefixlen>\n", argv[0]);
exit(EXIT_FAILURE);
}
char *ifName = argv[1];
char *addrStr = strtok(argv[2], "/");
char *prefixLenStr = strtok(NULL, "/");
if (inet_pton(AF_INET, addrStr, &addr) != 1) {
fprintf(stderr, "Invalid IPv4 address: %s\n", addrStr);
exit(EXIT_FAILURE);
}
prefixLen = atoi(prefixLenStr);
ifIndex = if_nametoindex(ifName);
if (ifIndex == 0) {
fprintf(stderr, "Invalid interface name: %s\n", ifName);
exit(EXIT_FAILURE);
}
struct sockaddr_nl srcAddr = {0};
srcAddr.nl_family = AF_NETLINK;
struct msghdr msg = {0};
char buf[BUF_SIZE] = {0};
struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
nlh->nlmsg_type = RTM_NEWADDR;
nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
nlh->nlmsg_seq = 1;
nlh->nlmsg_pid = getpid();
struct ifaddrmsg *ifa = (struct ifaddrmsg *)NLMSG_DATA(nlh);
ifa->ifa_family = AF_INET;
ifa->ifa_prefixlen = prefixLen;
ifa->ifa_index = ifIndex;
ifa->ifa_flags = IFA_F_PERMANENT | IFA_F_SECONDARY;
struct rtattr *rta = (struct rtattr *)((char *)ifa + sizeof(struct ifaddrmsg));
rta->rta_len = RTA_LENGTH(4);
rta->rta_type = IFA_LOCAL;
memcpy(RTA_DATA(rta), &addr, 4);
nlh->nlmsg_len = NLMSG_ALIGN(nlh->nlmsg_len) + rta->rta_len;
msg.msg_name = (void *)&srcAddr;
msg.msg_namelen = sizeof(srcAddr);
msg.msg_iov = (struct iovec *)buf;
msg.msg_iovlen = 1;
int sockFd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sockFd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
if (bind(sockFd, (struct sockaddr *)&srcAddr, sizeof(srcAddr)) == -1) {
perror("bind");
close(sockFd);
exit(EXIT_FAILURE);
}
if (sendmsg(sockFd, &msg, 0) == -1) {
perror("sendmsg");
close(sockFd);
exit(EXIT_FAILURE);
}
memset(buf, 0, BUF_SIZE);
while (1) {
if (recv(sockFd, buf, BUF_SIZE, 0) == -1) {
perror("recv");
close(sockFd);
exit(EXIT_FAILURE);
}
struct nlmsghdr *nlhRecv = (struct nlmsghdr *)buf;
while (NLMSG_OK(nlhRecv, BUF_SIZE)) {
switch (nlhRecv->nlmsg_type) {
case NLMSG_ERROR:
fprintf(stderr, "Error: %s\n", strerror(-nlhRecv->nlmsg_len));
close(sockFd);
exit(EXIT_FAILURE);
break;
case RTM_NEWADDR:
printf("IPv4 address configured successfully\n");
close(sockFd);
exit(EXIT_SUCCESS);
break;
default:
fprintf(stderr, "Unknown message type: %d\n", nlhRecv->nlmsg_type);
break;
}
nlhRecv = (struct nlmsghdr *)((char *)nlhRecv + NLMSG_ALIGN(nlhRecv->nlmsg_len));
}
}
return 0;
}