Failed to get interface list while using ioctl (WSAIoctl) compiled by cygwin

Marco Atzeri marco.atzeri@gmail.com
Fri Aug 12 12:22:39 GMT 2022


On 12.08.2022 14:01, dragon wrote:
> Hi,
>> Thans for your attention.
>> I had a problem doing porting the network part。I want to get a list of network devices that can be implemented on Linux with an ioctl interface. A set of ioctl interfaces is also provided on Windows called WSAIoctl with cmd SIO_GET_INTERFACE_LIST。The WSAIoctl interface is also encapsulated in cygwin and placed in /usr/include/w32api/, libs place in /usr/lib/w32api/ws2_32 .

mixing Posix and W32 API is seldom a good idea.
The attached code provides the full list of Network interface and
some details as
internal_name: {E9617ED6-8C03-4C53-AA3F-4FD6DBC596D5}
 flags: AF_INET6 up multicast
 address: fe80::9cbb:5d97:6ef:565%22
 friendly_name: LAN-Verbindung* 2
feel free to modify it for your purpose
Regards
Marco
-------------- next part --------------
/* #define _GNU_SOURCE * To get defns of NI_MAXSERV and NI_MAXHOST */
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
void print_flags(unsigned int flags)
{
 const char* sep = "", *sp = " ";
 if (flags & IFF_UP) {
 printf("%sup", sep);
 sep = sp;
 }
 if (flags & IFF_BROADCAST) {
 printf("%sbroadcast", sep);
 sep = sp;
 }
 if (flags & IFF_LOOPBACK) {
 printf("%sloopback", sep);
 sep = sp;
 }
 if (flags & IFF_NOTRAILERS) {
 printf("%snotrailers", sep);
 sep = sp;
 }
 if (flags & IFF_RUNNING) {
 printf("%srunning", sep);
 sep = sp;
 }
 if (flags & IFF_PROMISC) {
 printf("%spromisc", sep);
 sep = sp;
 }
 if (flags & IFF_MULTICAST) {
 printf("%smulticast", sep);
 sep = sp;
 }
}
int main(int argc, char *argv[])
{
 struct ifaddrs *ifaddr, *ifa;
 int family, s, n;
 char host[NI_MAXHOST];
 struct ifreq ifr;
 struct ifreq_frndlyname iff;
 struct ifreq_frndlyname * iffp;
 
 struct ifaddrs_hwdata * ifhwdata;
 if (getifaddrs(&ifaddr) == -1) {
 perror("getifaddrs");
 exit(EXIT_FAILURE);
 }
 /* Walk through linked list, maintaining head pointer so we
 can free list later */
 for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
 if (ifa->ifa_addr == NULL)
 continue;
 family = ifa->ifa_addr->sa_family;
 /* Display interface name and family (including symbolic
 form of the latter for the common families) */
 printf("internal_name: \t%s\n",ifa->ifa_name);
	printf(" flags: \t%s ",
 (family == AF_INET) ? "AF_INET " :
 (family == AF_INET6) ? "AF_INET6" : "unknown ");
 print_flags(ifa->ifa_flags);
	printf("\n");
 /* For an AF_INET* interface address, display the address */
 if (family == AF_INET || family == AF_INET6) {
 s = getnameinfo(ifa->ifa_addr,
 (family == AF_INET) ? sizeof(struct sockaddr_in) :
 sizeof(struct sockaddr_in6),
 host, NI_MAXHOST,
 NULL, 0, NI_NUMERICHOST);
 if (s != 0) {
 printf("getnameinfo() failed: %s\n", gai_strerror(s));
 exit(EXIT_FAILURE);
 }
 printf(" address:\t%s\n", host);
 ifhwdata=ifa->ifa_data;
 iffp=&(ifhwdata->ifa_frndlyname);
 printf(" friendly_name:\t%s\n\n", iffp->ifrf_friendlyname);
 }
 }
 freeifaddrs(ifaddr);
 exit(EXIT_SUCCESS);
}


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /