Python: socket.getnameinfo - Flaggor? *Löst*

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
JimmyAndersson
Inlägg: 26456
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Python: socket.getnameinfo - Flaggor? *Löst*

Inlägg av JimmyAndersson »

Såhär står det i manualen:

"socket.getnameinfo(sockaddr, flags)

Translate a socket address sockaddr into a 2-tuple (host, port). Depending on the settings of flags, the result can contain a fully-qualified domain name or numeric address representation in host. Similarly, port can contain a string port name or a numeric port number."



Det jag behöver hjälp med:

"Depending on the settings of flags"

Var hittar man information om hur dessa flaggor ska se ut?
Den citerade texten är likadan i online-manualen som i den "inbyggda" i Python
och jag lyckas inte hitta någon förklaring av flaggorna på nätet.



En bit av koden och mitt försök:

clientsocket, clientaddr = server.serversocket.accept()
temp = getnameinfo(clientsocket)


"clientsocket" är alltså socket-adressen.

Men koden ovan ger:
"TypeError: an integer is required" och pekar på raden med getnameinfo ovan.



pprint clientsocket ger:
<socket._socketobject object at 0x00BD8340>




Så en lite utförligare beskrivning av getnameinfo vore inte dumt.. Någon som sitter på en sådan? :)
sodjan
EF Sponsor
Inlägg: 43241
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: socket.getnameinfo - Flaggor?

Inlägg av sodjan »

Gissar lite här, och jag vet inte vad du har testat med förrutom
det i tråden, men prova med:

clientsocket, clientaddr = server.serversocket.accept()
temp = getnameinfo((clientsocket, clientaddr), 1)


Eller

mysocket = server.serversocket.accept()
temp = getnameinfo(mysocket, 1)


(1 som "flags" är en gissning, men jag tror att det måste vara med...)
Användarvisningsbild
JimmyAndersson
Inlägg: 26456
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: socket.getnameinfo - Flaggor?

Inlägg av JimmyAndersson »

Med:
temp = getnameinfo((clientsocket, clientaddr), 1)

så får jag:
"TypeError: must be string, not _socketobject"


Och med:
temp = getnameinfo(mysocket, 1)

så får jag:
"TypeError: getnameinfo() argument 1 must be a tuple"


Än så länge har jag inte hittat någon ledtråd i detta.
Det som förvirrar en aning är att felmeddelandena nu alltså har gett
tre olika bud för (vad jag antar är) första argumentet för getnameinfo. Dvs:

A) integer is required
B) must be string
C) must be a tuple



"jag vet inte vad du har testat med"

Tyvärr kommer jag inte ihåg allt jag testat under de 5-6 timmar som jag försökt lösa detta,
men idéerna börjar verkligen ta slut, så det är bara att komma med förslag. :)




Koden i förra inlägget är från mitt test-case. Här är den rätta:

Kod: Markera allt

    while True:
        readable, writable, errored = select.select(read_list, [], [])
        for s in readable:
            if s is server.serversocket:
                clientsocket, clientaddr = server.serversocket.accept()
                read_list.append(clientsocket)
                klienter[clientaddr] = clientsocket #Alla klienter som är eller har varit inloggade sedan servern startade.
                print "Connection from", clientaddr
            else:
                try:
                    data = s.recv(1024) #Tar emot info från klienten. 1024 är buffern.

Jag använder alltså select för att växla mellan olika klienter.

Efter den sista raden så kollar jag om klienten skrivit in någon av de förutbestämda "kommandona".
I dessa fall behöver jag kolla vilken ip-adress och port som denna klienten är inloggad med.
(Inte den porten de skriver i klienten (t.ex 23), utan den porten de har sett från serverns synvinkel, t.ex 4476.)
Därför tänkte jag använda just getnameinfo för att "hämta" denna info med hjälp av socket-adressen "s".

(Det som skiljer den här koden från min kod i förra inlägget är att jag i koden ovan
bara kan använda clientsocket och clientaddr för att får reda på vilken klient som loggade in sist.)


Än så länge har jag inte hittat något annat än getnameinfo för att göra det jag vill.
Användarvisningsbild
JimmyAndersson
Inlägg: 26456
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: socket.getnameinfo - Flaggor?

Inlägg av JimmyAndersson »

Efter ännu en pepparkaka så hittade jag ett alternativ till getnameinfo:

socket.getpeername()

"Return the remote address to which the socket is connected. This is useful to find out the port number of a remote IPv4/v6 socket, for instance. (The format of the address returned depends on the address family — see above.) On some systems this function is not supported."

"See above".. *Var* above menar de? Jaja, det fungerar iallafall.


Om jag bakar in detta i koden ovan:
temp = s.getpeername()
print temp


Så får jag:
('192.168.1.138', 4801)


För att skingra alla tvivel: Ja, det var precis det resultatet jag sökte. :)
Nu ska jag bara koppla in en till klient (rent fysiskt) och testa.

edit:
Och med en extra klient kan jag bekräfta att det blir helt rätt.
(Behöver två klienter på två olika ip-adresser för att verifiera
att "s" inte innehåller datorn som loggade in senast.)



----

Förresten:
Kan man inte hitta hjälp-texten för getpeername i Python-"skalet"?

Först kör jag import socket.
Sedan har jag testat flera olika varianter, men inget fungerar.
Varken help(getpeername) eller help(socket.getpeername)
Har även provat med () direkt efter getpeername.


Kör jag help(socket) så hittar jag det, men man får bläddra så enormt mycket...

Kod: Markera allt

    socket = class _socketobject(__builtin__.object)
     |  socket([family[, type[, proto]]]) -> socket object
     |
...
     |  getpeername(...)
     |      getpeername() -> address info
     |      
     |      Return the address of the remote endpoint.  For IP sockets, the address

T.ex att hitta att getsockname ligger "under" Socket.SocketType
krävde att jag fick köra help(socket) och leta. Det tog en stund.

-----


Hur som helst så har jag som sagt hittat en lösning, ett alternativ till getnameinfo.
Men: Om någon (trots årstiden) ruvar på svaret på det här med flaggorna (se första inlägget)
så vore det kul att veta svaret. Jag är alltid nyfiken. :)
sodjan
EF Sponsor
Inlägg: 43241
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: socket.getnameinfo - Flaggor?

Inlägg av sodjan »

> tre olika bud för (vad jag antar är) första argumentet för getnameinfo.

Jag är inte säker på det. Jag tror att integer har med "flags" att göra...

Jag har letat efter källkoden till getnameinfo, men det kanske inte
är python kod, så man får leta någon annanstans. Eller så är det
bara ett API mot någon standard TCPIP rutin eller liknande.

Lite mer info...

Jag letade lite i Python distributionen som jag krö och hittade
detta i en testrutin:

Kod: Markera allt

    def testInterpreterCrash(self):
        # Making sure getnameinfo doesn't crash the interpreter
        try:
            # On some versions, this crashes the interpreter.
            socket.getnameinfo(('x', 0, 0, 0), 0)
        except socket.error:
            pass
Men det verkar avsiktligt felaktigt för att forsera fram en krasch.

Kollade denna manual: http://h71000.www7.hp.com/doc/82final/6 ... -90002.pdf.
Sidan 4-31 "Sockets API Reference, getnameinfo( )", där finns lite info om argumenten.
Sen körde jag fast, och då såg jag att du hade hittat en lösning. getpeername() verkar
inte ingå i den "socket" som finns i min Python distribution...
Användarvisningsbild
JimmyAndersson
Inlägg: 26456
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: socket.getnameinfo - Flaggor?

Inlägg av JimmyAndersson »

Det var en utmärkt pdf-fil. :tumupp:
Synd att det är så få guider/dokumentation på nätet som är sådär välgjorda.


Jag lyckades få ordning på getnameinfo med hjälp av pdf-filen. :)

Så här:

Kod: Markera allt

        host = '0.0.0.0' #Servern. (Det går inte med 127.0.0.1 eller localhost eftersom det kan peka fel.)
        port = 23
        addr = (host, port) #Används av self.serversocket.bind(addr)
 ..
  ...
                        temp = getnameinfo(addr, NI_NOFQDN)      #Ger ('varion-ny', 'telnet')
                        temp = getnameinfo(addr, 0)      #Ger också ('varion-ny', 'telnet')
                        temp = getnameinfo(addr, 1)      #Ger också ('varion-ny', 'telnet')
                        temp = getnameinfo(addr, NI_NUMERICHOST)      #Ger ('0.0.0.0', 'telnet')
                        temp = getnameinfo(addr, NI_NUMERICSERV)      #Ger ('varion-ny', '23')
Jag trodde att jag skulle få ip-adressen och porten, med tanke på detta i Python-manualen:
"Translate a socket address sockaddr into a 2-tuple (host, port)"
Men det fick jag alltså inte. :)



Hur som helst så var det kul att lära sig hur argumenten ska se ut.

Tack för att du tittade närmare på detta. :tumupp:
sodjan
EF Sponsor
Inlägg: 43241
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Python: socket.getnameinfo - Flaggor? *Löst*

Inlägg av sodjan »

Förr all del! :-)
Och det är alltid kul att visa hur bra dokumentation ska se ut.
Digital Equipment Corp (DEC), tillsammans med IBM, kan detta.
Eller kunde, i DECs fall...

Även om den är skriven med tanke på TCPIP på OpenVMS, så verkar
det mesta vara ganska generiskt, som "2 Writing Network Applications"
och "3 Using the Sockets API" t.ex.
Skriv svar