🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
3 messages
3 total messages Started by Daniel Mróz Mon, 16 Nov 2009 12:41
Re: Lista kart sieciowych w Windows
#26936
Author: Daniel Mróz
Date: Mon, 16 Nov 2009 12:41
59 lines
2994 bytes
On 14.11.2009, sebob <obara.sebastian@gmial.com> wrote:
>> Czy ktoś zna jakiś sposób na listę kart sieciowych w Windows?
>> Oczywiście językiem programowania jest Python :)
> Może jakiś os.open("ipconfig")?
> Bo w linux-ie p=os.popen("/sbin/ifconfig") lub f = open("/proc/net/dev")
A to ma być lista kart sieciowych, czy lista adresów IP, bo to nie to samo.
Jedna karta sieciowa może mieć zero lub więcej adresów IP, w systemie mogą
być adresy przypisane do interfejsów logicznych (np. loopback) itp.
"ifconfig" (który zresztą jest już passe i powinno się używać "ip") raportuje
jedynie adresy, a nie listę urządzeń fizycznych. Natomiast do /proc/net/dev
w wielu dystrybucjach potrzebne są uprawnienia roota, aby móc ten plik
odczytać.
Jeśli potrzeba jest tylko lista IPków, poniższa funkcja to zapewni, bez
konieczności parsowania wyjścia komendy, które może się zmienić. Wystarczają
uprawnienia zwykłego usera.


import array
import fcntl
import socket
import struct


IOCTL_SIOCGIFCONF = 0x8912

def local_ipaddrs(self, max_if=16):
    # max_if to maksymalna liczba interjesów, jaka będzie
    # sprawdzana. Można dać coś dużego, jeśli nie boimy
    # się zużycia pamięci.
    if struct.calcsize('P') == 8:
        # 64bit
        struct_size = 40
    else:
        # 32bit
        struct_size = 32

    data_array_size = max_if * struct_size
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    data_array = array.array('B',  [ 0 for i in xrange(data_array_size) ])
    data_size = struct.unpack('iL', fcntl.ioctl(sock.fileno(), IOCTL_SIOCGIFCONF, struct.pack('iL', data_array_size, data_array.buffer_info()[0])))[0]
    sock.close()

    ipaddrs = []
    for i in xrange(0, data_size, struct_size):
        ipaddrs.append(socket.inet_ntoa(data_array[i + 20:i + 24]))
    return ipaddrs

print local_ipaddrs(16)



Pozdrawiam
Beorn

-- 
Daniel 'Beorn' Mróz <beorn@alpha.pl>    http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V!  PS+ PE++ Y+ PGP++ t- 5  X R !tv b+ DI D++ G++ e h*]
[                          r++  y+                           ]
Re: Lista kart sieciowych w Windows
#26937
Author: mak
Date: Fri, 20 Nov 2009 17:57
11 lines
1863 bytes
On 16 Lis, 13:41, Daniel Mróz <be...@alpha.pl> wrote:
> On 14.11.2009, sebob <obara.sebast...@gmial.com> wrote:>> Czy ktoś zna jakiś sposób na listę kart sieciowych w Windows?
> >> Oczywiście językiem programowania jest Python :)
> > Może jakiś os.open("ipconfig")?
> > Bo w linux-ie p=os.popen("/sbin/ifconfig") lub f = open("/proc/net/dev")
>

>     data_size = struct.unpack('iL', fcntl.ioctl(sock.fileno(), IOCTL_SIOCGIFCONF, struct.pack('iL', data_array_size, data_array.buffer_info()[0])))[0]

fcntl na windzie w taki sposob nie zadziala
najlepiej skorzystac z WMI lub popen('ipconfig /all')
Re: Lista kart sieciowych w Windows
#26938
Author: Daniel Mróz
Date: Fri, 20 Nov 2009 19:09
21 lines
1908 bytes
On 20.11.2009, mak <grzegorz.makarewicz@gmail.com> wrote:
>> >> Oczywiście językiem programowania jest Python :)
>> > Może jakiś os.open("ipconfig")?
>> > Bo w linux-ie p=os.popen("/sbin/ifconfig") lub f = open("/proc/net/dev")
>>     data_size = struct.unpack('iL', fcntl.ioctl(sock.fileno(), IOCTL_SIOCGIFCONF, struct.pack('iL', data_array_size, data_array.buffer_info()[0])))[0]
> fcntl na windzie w taki sposob nie zadziala
> najlepiej skorzystac z WMI lub popen('ipconfig /all')
Ja tu o Linuksie. Na Windows się nie wyznaję. Nie mój cyrk.
Podaję tylko receptę na uzyskanie IPków w odpowiedni sposób, zamiast
babrać się w parsowanie wyjścia /sbin/ip, /sbin/ifconfig czy grzebania
w /proc.


Pozdrawiam
Beorn

-- 
Daniel 'Beorn' Mróz <beorn@alpha.pl>    http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V!  PS+ PE++ Y+ PGP++ t- 5  X R !tv b+ DI D++ G++ e h*]
[                          r++  y+                           ]
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads