Seite 1 von 1

Probleme bei Abfrage der internen IP

Verfasst: Dienstag 26. August 2008, 18:16
von dieter1a
Hallo,
ich habe ein Problem bei der Suche nach der internen IP.

Code: Alles auswählen

import socket;
print socket.getaddrinfo(socket.gethostname(), None)[0][4][0]
liefert mir den Fehler:
AttributeError: getaddrinfo

Bei anderen Usern gelingt das.
Woran könnte das bei mir liegen?

MfG dieter1a

Verfasst: Dienstag 26. August 2008, 18:31
von BlackJack
Schau mal wie Dein Skript heisst. Da Du nicht den ganzen Traceback zeigst muss ich raten, aber ich würde mal auf `socket.py` tippen. Falls dem so ist, rate Du mal was mit dem ``import`` importiert wird. ;-)

Verfasst: Dienstag 26. August 2008, 18:31
von Rebecca
Du hast nicht zufaellig eine datei socket.py in deinem Working Dir rumfliegen?

Verfasst: Dienstag 26. August 2008, 18:42
von dieter1a
Python 2 ist die interne Scriptsprache bei Blender 2.25.
Installiert habe ich deswegen Python 2.0.1, weil Blender 2.25 grundsätzlich nur mit Python 2 umgehen kann.
Die Obige Abfrage ist also in Blender eingebaut und liefert mir den Fehler auf der Konsole.
Ein anderer Blender-User sagte mir im Forum, dass das Script bei ihm klappt.
Es ist erstmal nur eine Testabfage um überhaupt mal weiter zu kommen.
Externe UDP-Verbindung klappt bei meinem Multi-User Spiel hervorragend.
Aber fürs Intranet brauche ich die internen IP`s.
Das krieg ich leider nicht auf die Reihe.

Verfasst: Dienstag 26. August 2008, 19:30
von dieter1a
Rebecca hat geschrieben:Du hast nicht zufaellig eine datei socket.py in deinem Working Dir rumfliegen?
Das verstehe ich nicht so ganz!
Ein Script mit diesem namen gibt es in meiner Produktion nicht.

Verfasst: Dienstag 26. August 2008, 19:48
von dieter1a
BlackJack hat geschrieben:Schau mal wie Dein Skript heisst. Da Du nicht den ganzen Traceback zeigst muss ich raten, aber ich würde mal auf `socket.py` tippen. Falls dem so ist, rate Du mal was mit dem ``import`` importiert wird. ;-)
Echt keine Ahnung, was ich da jetzt raten soll.

Verfasst: Dienstag 26. August 2008, 20:10
von BlackJack
Was sagt denn ein:

Code: Alles auswählen

import socket
print dir(socket)
print socket

Verfasst: Dienstag 26. August 2008, 20:31
von dieter1a
'AF_APPLETALK', 'AF_INET', 'AF_IPX', 'AF_UNSPEC', 'INADDR_ALLHOSTS_GROUP', 'INA
DDR_ANY', 'INADDR_BROADCAST', 'INADDR_LOOPBACK', 'INADDR_MAX_LOCAL_GROUP', 'INAD
DR_NONE', 'INADDR_UNSPEC_GROUP', 'IPPORT_RESERVED', 'IPPORT_USERRESERVED', 'IPPR
OTO_GGP', 'IPPROTO_ICMP', 'IPPROTO_IDP', 'IPPROTO_IGMP', 'IPPROTO_IP', 'IPPROTO_
MAX', 'IPPROTO_ND', 'IPPROTO_PUP', 'IPPROTO_RAW', 'IPPROTO_TCP', 'IPPROTO_UDP',
'IP_ADD_MEMBERSHIP', 'IP_DEFAULT_MULTICAST_LOOP', 'IP_DEFAULT_MULTICAST_TTL', 'I
P_DROP_MEMBERSHIP', 'IP_MAX_MEMBERSHIPS', 'IP_MULTICAST_IF', 'IP_MULTICAST_LOOP'
, 'IP_MULTICAST_TTL', 'IP_OPTIONS', 'IP_TOS', 'IP_TTL', 'MSG_DONTROUTE', 'MSG_OO
B', 'MSG_PEEK', 'SOCK_DGRAM', 'SOCK_RAW', 'SOCK_RDM', 'SOCK_SEQPACKET', 'SOCK_ST
REAM', 'SOL_IP', 'SOL_SOCKET', 'SOL_TCP', 'SOL_UDP', 'SOMAXCONN', 'SO_ACCEPTCONN
', 'SO_BROADCAST', 'SO_DEBUG', 'SO_DONTROUTE', 'SO_ERROR', 'SO_KEEPALIVE', 'SO_L
INGER', 'SO_OOBINLINE', 'SO_RCVBUF', 'SO_RCVLOWAT', 'SO_RCVTIMEO', 'SO_REUSEADDR
', 'SO_SNDBUF', 'SO_SNDLOWAT', 'SO_SNDTIMEO', 'SO_TYPE', 'SO_USELOOPBACK', 'Sock
etType', 'TCP_NODELAY', '__builtins__', '__doc__', '__file__', '__name__', '_fil
eobject', '_realsocketcall', '_socketobject', 'error', 'errorTab', 'getfqdn', 'g
ethostbyaddr', 'gethostbyname', 'gethostbyname_ex', 'gethostname', 'getprotobyna
me', 'getservbyname', 'htonl', 'htons', 'inet_aton', 'inet_ntoa', 'ntohl', 'ntoh
s', 'socket']
<module 'socket' from 'C:\Python20\Lib\socket.pyo'>
dr
PYTHON SCRIPT ERROR:
Traceback (most recent call last):
File "interneIP.py", line 16, in ?
AttributeError: getaddrinfo
Inkl. Errormeldung.

Edit:
Augenscheinlich gibts diese Funktion nicht in Python 2.0.1.
Kann man sich eine Version zusammenstricken, indem man socket aus höherer Version in Python 2.0.1 rein kopiert ?
Quasi eine eigene Python 2.0.1 bastelt?
Oder gibts eine andere Lösung an die interne IP zu kommen?

Verfasst: Dienstag 26. August 2008, 21:22
von BlackJack
Eine aktuellere Blender-Version kannst Du nicht installieren?

Verfasst: Dienstag 26. August 2008, 21:28
von dieter1a
Au weia, Du musst Dir mal das Projekt anschauen.
Da müsste ich jedes Objekt, also quasi alles neu machen, weil Blender > 2.25 nicht mehr die eigene Physik, sondern Bullet verwendet.
Das ist eine Arbeit seit 2003.

Verfasst: Mittwoch 27. August 2008, 09:25
von Leonidas
dieter1a hat geschrieben:Kann man sich eine Version zusammenstricken, indem man socket aus höherer Version in Python 2.0.1 rein kopiert ?
Naja, das aktuelle Socket wird nicht gehen, weil es in C geschrieben ist und die API sich vermutlich geändert hat. Du könntest ctypes nutzen, aber das braucht auch eine aktuellere Python-Version. Alternativ könntest du einfach nur diese eine Funktion als C-Modul schreiben und versuchen sie zum laufen zu bekommen, aber dazu braucht man logischerweise C-Kenntnisse.

Verfasst: Mittwoch 27. August 2008, 09:38
von dieter1a
Da kommt mir eine Idee.
Kann man mit neuerem Python nicht eine Anwendung schreiben, die dann die jeweilige interne IP in eine txt schreibt?
Dort kann man sie ja bei Bedarf auslesen.
Außerdem müsste das ja auch mit Delphi gehen, das habe ich für das Einlogg-Programm verwendet. :idea:

Verfasst: Mittwoch 27. August 2008, 09:50
von Leonidas
Ja, man kann die IP auf stdout ausgeben lassen und dann von Python 2.0 einlesen lassen. Dann spart man sich auch temporäre Dateien.

Verfasst: Mittwoch 27. August 2008, 14:26
von dieter1a
Es geht einfacher als ich dachte!
In einer Test-Applikation konnte ich herausfinden, dass anstelle der internen IP einfach der Computername eingesetzt werden kann.
Damit funktioniert es genauso. Man braucht also nur socket.gethostname(), was ja in Python 2.0 enthalten ist.

MfG dieter1a

Verfasst: Mittwoch 27. August 2008, 15:10
von Rebecca
Mit dem automatischen Herausfinden von sowohl IP-Adressen als auch Host-Namen kann man aber auf die Nase fliegen. Ein Host kann mehrere Aliase, Interfaces etc haben, und dann findet man nicht unbedingt das richtige. Ein Admin/Anwender sollte sowas konfigurieren koennen.

Verfasst: Mittwoch 27. August 2008, 15:15
von dieter1a
Der Netzwerkbetreiber konfiguriert ja die Computernamen, sodass sie nicht doppelt vorkommen.

Verfasst: Mittwoch 27. August 2008, 16:00
von dieter1a
Ich kann mit Delphi die interne IP herauslesen.
Das ist mir aber zu gefährlich.
Auf der anderen Seite nutzt niemand die Interne, wenn sie nicht mit der Externen in zusammenhang gebracht wird.