Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » aktuelle Netz.verbindung ermitteln ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.10.2003, 17:15 Uhr
~centrino
Gast


Hallo,

Ich bin Neuling in der Sachen Netzwerkprogrammierung.
Ich suche ein ganz einfaches C Programm mit Quellcode unter Linux, welches die aktuelle Netzwerkverbingdung unter Linux ermitteln kann.
z.b

Ich habe 2 Netzwerkschnittstellen, eth0 und wlan0 ( WLAN), beide sind aktiv. Es kann sein dass eine Schnittstelle nun nicht mehr mit
Netzwerk verbunden ist. So soll das Programm sofort benachrichten koennen, welche gerade aktiv ist, vielleicht noch besser wenn
es noch den Durchsatz ermitteln kann.
Oder wie kann ich es selber ein programmieren ??
Ist netstat geeignet dafür ?

Danke !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.10.2003, 17:33 Uhr
typecast
aka loddab
(Operator)


->
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.10.2003, 18:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Um eine Liste der verfügbaren NetInterfaces zu bekommen, gehst Du normalerweise so vor:
1. Ein beliebiges Socket öffnen.
2. Mit diesem Socket einen SIOCGIFCONF ioctl call absetzen. Du musst dem Call eine vorinitialisierte ifconf Struct mitliefern.
3. Die Rückgabe von 2 dahin überprüfen, ob genügen Speicher in der ifconf Struct bereitgesetllt worden war, ggf. abermals probieren
Bei mir sieht das so aus, ist nur ein Codefragment:

C++:
NetInterface::string_vector
NetInterface::getInterfaceNames()
{
        string_vector astrNames;

        Socket oTempSocket = getAnOpenedSocket();
        int nCount = 4;
        struct ifconf oConfig;
        struct ifreq* poRequest = NULL;

        try
        {

                //
                // Loop until all devices are received
                //
                for(;;)
                {
                        //
                        // Get memory for request
                        //
                        poRequest = new ifreq[nCount];
                        oConfig.ifc_buf = (char*)poRequest;
                        oConfig.ifc_len = nCount*sizeof(struct ifreq);

                        //
                        // Do request, check if all entries read
                        //
                        oTempSocket.IOCtl(SIOCGIFCONF, &oConfig);
                        if (size_t(oConfig.ifc_len) >= nCount*sizeof(struct ifreq))
                        {
                                delete [] poRequest;
                                poRequest = NULL;
                                nCount <<= 1;
                                continue;
                        }

                        //
                        // Store Result
                        //
                        int j;
                        int i;
                        for(i=0, j=0; i<oConfig.ifc_len; i+=sizeof(struct ifreq), ++j)
                        {
                                astrNames.push_back(poRequest[j].ifr_name);
                        }
                        break;
                }
        }
        //
        // Cleanup
        //
        catch (...)
        {
                delete [] poRequest;
                oTempSocket.close();
                throw;
        }
        delete [] poRequest;
        oTempSocket.close();

        return astrNames;
}




Damit hast Du nun die NetInterfacenamen.
Diese kannst Du für weitere ioctl calls machen, um herauszufinden, ob das Interface "oben" ist. WElcher ioctl das genau ist, weiß ich nicht aus dem handgelenk. man ioctl_list sollte weiterhelfen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 16.10.2003 um 18:28 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.10.2003, 23:42 Uhr
~centrino
Gast


danke,
ich werde mal es auseinander setzen, da in C wäre besser
gruss
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.10.2003, 15:07 Uhr
~centrino
Gast


Jetzt habe ich die Namen von den aktiven interfaces,
Nun möchte ich wissen, welche die bessere Übertragungsqualität hat, wie muss ich vorgehen,
Ich meine in C

Zb. Mein Latop ist gleichzeitg mit eth0 und wlan0 zu einem Server verbunden.

gruss
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.11.2003, 16:07 Uhr
~ölie
Gast


test
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.12.2003, 13:45 Uhr
~centrino
Gast


Hi,

mit der for Schleife unten kann ich auf die Infos von den Netwerkkarten zugreifen,
aber es sind noch 2 Sachen die ich gern wissen will:

1. die Hardwareadrese

C++:
#define ifr_hwaddr      ifr_ifru.ifru_hwaddr    /* MAC address */



2. Die bandbreite:

C++:
#define ifr_bandwidth   ifr_ifru.ifru_ivalue    /* link bandwidth */

wie kriege ich dies raus?

for (i = 0; i < numdevs; i++)
    {
          /* devptr points into an array of ifreq structs. */
          devptr = &ifc_conf.ifc_req[i];
    
          if (devptr->ifr_addr.sa_family != AF_INET)
            continue;
    
          if (ioctl(sd,SIOCGIFFLAGS,devptr) < 0)
            {
              fprintf(stderr,"Error: Unable to get device interface flags.\n");
              perror("ioctl");
              close(sd);
              return -1;
            }
        
         if ((devptr->ifr_flags & IFF_LOOPBACK) == 0)
            {    
              if ((devptr->ifr_flags & IFF_UP) == !0)
               {
                printf("Active interface[%d]: %s \n", i, devptr->ifr_name );
                infs_addr.s_addr = ((struct sockaddr_in*)&devptr->ifr_addr)->sin_addr.s_addr;
                //printf("Interface long int addr: %d", infc_addr.s_addr);
                //printf("\n");
                printf("IP addr: %s\n", inet_ntoa(infs_addr));
                printf("metric: %d \n", devptr->ifr_name);
                printf("mtu: %d \n", devptr->ifr_mtu);
                printf("newname: %d \n",inet_ntoa(devptr->ifr_hwaddr));
                printf("bandwith: %d \n", devptr->ifr_bandwidth);
                printf("\n \n");
            }
        }                                      
    }




Bearbeitung von Pablo:

ICH MACH JA KEINE WITZE: BITTE CPP TAGS SELBER BENUTZEN


Dieser Post wurde am 11.12.2003 um 14:31 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.12.2003, 13:24 Uhr
~ölie
Gast


Hallo Liste,

ich habe folgendes C-Problem (Linux). Ich würde gerne die Routing Tabelle um einen default-Eintrag (Gateway) erweitern. Dieses soll unter einem kleinen C-Programm geschehen.

Weiß leider nicht genau wie ich die rtentry-Struktur zu füllen habe?

struct rtentry r;
struct sockaddr_in *default_gw;

default_gw = (struct sockaddr_in *) &r;
default_gw->sin_family = AF_INET;
default_gw->sin_addr.s_addr = GatewayAdresse;

sockioctl = socket(AF_INET, SOCK_DGRAM, 0);

r.rt_flags = RTF_UP | RTF_GATEWAY; // ????

ioctl(sockioctl, SIOCADDRT, (char *) &r);

(Bisher lassen sich nur "einfache" Routing Einträge realisieren.)

Wenn mir jemand weiterhelfen kann, wäre ich sehr Dankbar!
(kleiner Quellcode wäre sehr hilfreich )



Bearbeitung von FloSoft:

Es wurde oft genug gesagt! BENUTZT CPP-TAGS! Den nächsten Post ohne CPP-Tags lösch ich!


Dieser Post wurde am 12.12.2003 um 13:54 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.12.2003, 13:32 Uhr
virtual
Sexiest Bit alive
(Operator)


@Ölie
Bitte mach für Dein Thema einen neuen Topic auf. Dafür sind sie nänmlich da.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.12.2003, 16:20 Uhr
~ölie
Gast


OK!
->Nicht aufgepasst.

Meine Frage hat sich aber geklärt. ->kein Topic mehr nötig!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: