Jump to content
Nokioteca Forum

[pys60] Come Conoscere Il Proprio Indirizzo Ip?


Enzo74
 Share

Recommended Posts

volendo fare un applicazione che comunica dati tra due cell via rete mi sorge spontaneo un primo problema. il modulo socket ha percaso un comando o una proprietà per conoscere il proprio indirizzo ip in quel momento? grazie

import socket

socket.gethostname()

fornisce 'localhost'

Non se se serve quando si è connessi.

Link to comment
Condividi su altri siti

in una intranet sarebbe più che sufficiente... purtroppo con il cell c'è bisogno di un ip... su altri tips ho visto addirittura esempi che richiamano qualche sito che restituisce l'ip e attraverso un indaginoso metodo ricercavano il testo che indicava l'ip...

ma possibile che non esista una funzione specifica per questa cosa così importante?

Link to comment
Condividi su altri siti

Ciao Enzo, purtroppo non so aiutarti a riguardo, pero' perche' ti serve conoscere il tuo indirizzo ip per comunicare con l'altro cell?

Non ti basta conoscere l'indiritto ip del dispositivo remoto a cui ti vuoi connettere?

Nel momento in cui ti connetti all'ip di destinazione, lui ricevera' il tuo ip.

Link to comment
Condividi su altri siti

mi serve perchè ho visto che l'ip è dinamico con la tim e quindi ho bisogno che la parte server mi comunichi l'ip in modo tale che la parte client possa contattarlo. purtroppo con il localhost esperienze passate su visualbasic sullo stesso problema mi dava l'errore di timeout perchè non riusciva a risolvere l'host...

Link to comment
Condividi su altri siti

Non ho capito bene...

L'applicazione che vuoi realizzare fa sia da client che da server?

Supponendo che il cell_S agisca da server ed il cell_C agisca da client... allora e' il cell_C a connettersi al cell_S e nel momento stesso in cui si connette, il cell_S viene a conoscenza dell'ip del cell_C, non e' necessario che il cell_C glielo invii esplicitamente come parte dei dati, xche' e' gia' incluso come parte dell'header del protocollo tcp/udp.

Ma forse non ho capito io cosa intendevi dire...

Modificato da Il.Socio
Link to comment
Condividi su altri siti

hai ragione non sono stato chiaro... ho buttato giù delle righe di codice senza verificare però al 100% la sintassi ma giusto per rendere l'idea... io volevo collegarmi ad un determinato ip con una determinata porta aperta per inviarci dei messaggi testuali al prezzo della connessione internet (quindi senza flat un paio di centesimi possono bastare per tutto il giorno visto che con 2 cent si scambiano più o meno 7kb).

avevo pensato a qualcosa di simile per il lato client:

import socket

HOST = '111.111.111.111'

PORT = 5555

print "in connessione..."

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print "comunicazione col server..."

s.connect((HOST, PORT))

print "connesso"

s.send('Hello, world')

print "dati inviati"

data = s.recv(1024)

s.close()

print 'risposta:', `data`

però mi chiedevo come faccio a sapere l'ip del server?

tempo fà ho fatto una cosa molto simile con VB che funzionava alla grande e praticamente dato che usavamo vodafone l'ip cambiava sempre ad ogni connessione... si metteva l'ip in una casella di testo (che il codice assumeva come variabile) e dato che la porta era fissa avveniva la comunicazione, quindi in effetti l'ip del client non interessava ma quello del server si...

Link to comment
Condividi su altri siti

per sapere l'ip del server, la cosa migliore che puoi fare e' risolverne il nome usando il dns, in phyton non ti saprei dire come...

Presumo vi sia una funzione tipo

ResolveAddress('www.nokioteca.net') e restituisce il relativo ip...

Puoi anche provare a specificare come host 'www.nokioteca.net' e forse viene risolto internamente nel relativo ip...

Se il server non dovesse disporre di un dns allora dovrai installare sul server un programmino tipo no-ip che fornisce un nome mnemonico del tipo 'nokioteca.no-ip.com'

Ora sono di fretta... :blink:

Link to comment
Condividi su altri siti

Ma cosi' credo che recuperi il tuo indirizzo, non quello del server che vuoi contattare...

Ma forse la nostra incomprensione, nasce tutto dalle definizioni che stiamo usando...

Per me il server e' l'host remoto a cui la tua applicazione (client) si vuole connettere... Eseguendo quel codice, recuperi l'ip del client, non del server.

Modificato da Il.Socio
Link to comment
Condividi su altri siti

certo... ma io quella routine la metto sulla parte server... il server comunica al client il proprio ip e il client così si può collegare al server. una volta che il server accetta la richiesta a sua volta sa l'indirizzo del client.

se riesco a trovare i sorgenti del software che feci in vb te li faccio vedere così magari una volta fatto anche in pys60 è un ottimo tutorial sulla portabilità di alcuni metodi e su come sviluppare la stessa idea su diversi linguaggi.

oltretutto il 90% di quel codice dovrebbe andare con mobilevb dell'appforge (per chi di noi programma in quel linguaggio) perchè le api sono le stesse...

Link to comment
Condividi su altri siti

Server: fornisce il servizio... ha una porta aperta in cui accetta le richiesta da parte dei client.

Client: usufruisce del servizio... e' colui che inizia la connessione e si connette alla porta aperta del server per utilizzarne il servizio.

il server comunica al client il proprio ip e il client così si può collegare al server.

Il server non puo' comunicare al client il proprio indirizzo ip, perche' questo presuppone che il server si debba collegare al client, cosa che non e' possibile perche il client non ha nessuna porta aperta su cui fornisce nessun servizio...

Chi inizia una connessione verso un'altro e' sempre il client della situazione e "l'altro" e' il server... uno stesso programma, durante la sua esecuzione, puo' agire a volte da client ed a volte da server a seconda che inizi una connessione oppure che accetti una connessione in arrivo.

Mettendo da parte le definizioni...

Ho sostituito Server con A e client con B

A comunica a B il proprio ip

Questo presume che A conosca l'indirizzo ip di B per poter iniziare la comunicazione e contattarlo per fornirgli il proprio indirizzo. (***)

Una volta che A ha instaurato la comunicazione con B, B sa l'indirizzo di A perche' ne ha appena accettato la connessione.

e B così si può collegare ad A

Esiste gia' una connessione in piedi tra A e B, quella che A ha utilizzato per contattare B e comunicargli il proprio indirizzo ip, quindi i due possono gia' comunicare su quella connessione.

una volta che il A accetta la richiesta a sua volta sa l'indirizzo di B

Supponendo di terminare la connessione che era in piedi per iniziarne una nuova...

A conosce gia' l'indirizzo di B perche' lo sapeva fin dall'inizio (***)

Modificato da Il.Socio
Link to comment
Condividi su altri siti

Ma il meccanismo che hai descritto non e' applicabile perche' A non conosce a priori l'ip di B.

Piuttosto che l'invio dell'ip attraverso sms, che implica anche che dall'altra parte si inserisca manualmente l'ip ad ogni esecuzione del programma, puoi passare attraverso un dns.

In questi casi, A si registra su servizi di dns gratuiti tipo www.no-ip.com

Dopo la registrazione gli viene assegnato un nome di dominio di 3 livello ad es: mioserver.no-ip.com

A (es. ip 200.0.0.1) quando viene avviato effettua l'autenticazione tramite login/pass su www.no-ip.com e gli comunica il suo ip attuale (200.0.0.1) che www.no-ip.com provvedera' ad associare al dns che gli e' stato assegnato (mioserver.no-ip.com)

B per potersi connettere ad A non dovra' fare altro che risolvere il nome mioserver.no-ip.com e gli sara' restituito l'ip attuale di A 200.0.0.1 a cui si potra' poi collegare.

Modificato da Il.Socio
Link to comment
Condividi su altri siti

In VB il programma l'ho già fatto un pò di tempo fà e funziona egragiamente. questo è il codice della parte client

posto il codice così anche chi è interessato al mobilevb si può fare un idea...

'centrare il form all'avvio

Public Sub CenterForm(frmTarget As Form)

frmTarget.Move (Screen.Width - frmTarget.Width) / 2, (Screen.Height - frmTarget.Height) / 2

End Sub

'il bottone connetti... praticamente in text1.text ci metto l'IP del server

'che ci comunicavamo per sms per semplicità

Private Sub Command1_Click()

Winsock1.RemoteHost = Text1.Text

Winsock1.RemotePort = 4444

Winsock1.Connect

Command1.Enabled = False

Command2.Enabled = True

Command3.Enabled = True

End Sub

'questo è il pulsante della disconnessione.

'la shape era un cerchio che si colorava di verde o di rosso

'a seconda se eri connesso o disconnesso

Private Sub Command2_Click()

Winsock1.Close

Command1.Enabled = True

Command2.Enabled = False

Command3.Enabled = False

Shape1.BackColor = 255

End Sub

'questo inviava una parola durante la chattata

'text5 era il nickname e text2 quello che diceva

Private Sub Command3_Click()

If Winsock1.State = sckConnected Then

Dim stringainviata As String

stringainviata = Text5.Text + ": " + Text2.Text & vbCrLf

Winsock1.SendData stringainviata

Text3.Text = Text3.Text + stringainviata

Text2.Text = ""

Text3.SelStart = 0

Text3.SelLength = Len(Text3.Text)

ultimo = Text3.SelLength

Text3.SelStart = ultimo + 1

Else

Shape1.BackColor = 65535

End If

End Sub

'questo salvava la chattata in un file di testo

Private Sub Command4_Click()

Open "chatlog.txt" For Output As 1

Print #1, Text3.Text

Close 1

MsgBox "Il LogFile della chat è stato salvato nel file c:\chatlog.txt", vbInformation, "chat"

End Sub

'pulsante chiudi

Private Sub Command5_Click()

Unload Me

End Sub

'le cose che succedevano all'avvio dell'applicazione

Private Sub Form_Load()

IntraChat.Enabled = False

nick = InputBox("Inserire il nick name...")

CenterForm Me

Text4.Text = Winsock1.LocalIP

Text5.Text = nick

End Sub

Private Sub Form_Unload(Cancel As Integer)

IntraChat.Enabled = True

End Sub

'o invio o premere bottone di invia testo era uguale

Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode = vbKeyReturn Then Command3 = True

End Sub

'questo diceva quanto era lunga la chattata

Private Sub Text3_Change()

Text6.Text = Len(Text3.Text)

End Sub

'la gestione dei dati in arrivo. la ricezione dal server

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim InDati As String

Winsock1.GetData InDati, vbString

Text3.Text = Text3.Text + InDati

Text3.SelStart = 0

Text3.SelLength = Len(Text3.Text)

ultimo = Text3.SelLength

Text3.SelStart = ultimo + 1

End Sub

'colorava di verde l'indicatore di connessione

Private Sub Winsock1_Connect()

Shape1.BackColor = &HC000&

End Sub

Link to comment
Condividi su altri siti

QUESTA E' LA PARTE SERVER

Public Sub CenterForm(frmTarget As Form)

frmTarget.Move (Screen.Width - frmTarget.Width) / 2, _

(Screen.Height - frmTarget.Height) / 2

End Sub

Private Sub Command2_Click()

Open "chatlog.txt" For Output As 1

Print #1, Text2.Text

Close 1

MsgBox "Il LogFile della chat è stato salvato nel file c:\chatlog.txt", vbInformation, "chat"

End Sub

Private Sub Command3_Click()

Unload Me

End Sub

Private Sub Text2_Change()

Text6.Text = Len(Text2.Text)

End Sub

Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode = vbKeyReturn Then Command1 = True

End Sub

Private Sub Command1_Click()

If Winsock1.State = sckConnected Then

Dim stringainviata As String

stringainviata = Text5.Text + ": " + Text3.Text & vbCrLf

Winsock1.SendData stringainviata

Text2.Text = Text2.Text + stringainviata

Text3.Text = ""

Text2.SelStart = 0

Text2.SelLength = Len(Text2.Text)

ultimo = Text2.SelLength

Text2.SelStart = ultimo + 1

Else

Shape1.BackColor = 65535

End If

End Sub

Private Sub Form_Load()

IntraChat.Enabled = False

nick = InputBox("Inserire il nick name...")

CenterForm Me

Text4.Text = Winsock1.LocalIP

Text1.Text = Winsock1.LocalHostName

Winsock1.LocalPort = 4444

Winsock1.Listen

Text5.Text = nick

End Sub

Private Sub Form_Unload(Cancel As Integer)

IntraChat.Enabled = True

End Sub

Private Sub Winsock1_Close()

Shape1.BackColor = 255

Winsock1.Close

Winsock1.Listen

End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

Shape1.BackColor = &HC000&

If Winsock1.State <> sckClosed Then Winsock1.Close

Winsock1.Accept requestID

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim InDati As String

Winsock1.GetData InDati, vbString

Text2.Text = Text2.Text + InDati

Text2.SelStart = 0

Text2.SelLength = Len(Text2.Text)

ultimo = Text2.SelLength

Text2.SelStart = ultimo + 1

End Sub

Link to comment
Condividi su altri siti

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share

×
×
  • Crea Nuovo...

Informazione Importante

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy