Невозможно скопировать массив символов в структуру ifreq s. Ниже приведено объявление, которое было определено:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>
char interface[100];//="wlp1s0";
char reader_mac[13] = {00};
int main()
{
FILE *f = popen("ip addr show | awk '/inet.*brd/{print $NF}'", "r");
while (fgets(interface, 100, f) != NULL) {
}
strtok(interface, "\n"); // kaylum's Suggestion from the comments below
printf( "interface :: %s\n", interface);
pclose(f);
struct ifreq s;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strcpy(s.ifr_name, interface);
// strcpy(s.ifr_name, "wlp1s0");
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
int i;
for (i = 0; i < 6; ++i){
unsigned char data = s.ifr_addr.sa_data[i];
// printf("ddd:::%02x\n", data );
sprintf(reader_mac+(i*2), "%02x", data);
}
reader_mac[12] = '\0';
printf("reader_mac ::: %s\n",reader_mac);
}
}
Теперь, копируя интерфейс в s.ifr_name, я не могу получить адрес ma c данного интерфейса, тогда как если я заменю strcpy (s .ifr_name, interface) как strcpy (s.ifr_name, "wlp1s0"), то же самое может вернуть адрес ma c.
Я могу получить активные сетевые интерфейсы с помощью системной команды,
interface :: wlp1s0
Принимая во внимание, что полученный сетевой интерфейс передается в strcpy () для копирования интерфейса в s.ifr_name, I Я не могу получить адрес ma c.
Как это здесь решать?
Предложение kaylum из комментариев:
После добавления strtok (interface, "\ n"); в приведенном выше скрипте он не может получить адрес ma c.
reader_mac ::: fc017c0f2b75