Enzo74 Pubblicato: 30 Novembre 2006 Segnalazione Share Pubblicato: 30 Novembre 2006 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 Link to comment Condividi su altri siti More sharing options...
Oper Pubblicato: 30 Novembre 2006 Segnalazione Share Pubblicato: 30 Novembre 2006 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 More sharing options...
Enzo74 Pubblicato: 30 Novembre 2006 Autore Segnalazione Share Pubblicato: 30 Novembre 2006 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 More sharing options...
Il.Socio Pubblicato: 30 Novembre 2006 Segnalazione Share Pubblicato: 30 Novembre 2006 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 More sharing options...
Enzo74 Pubblicato: 30 Novembre 2006 Autore Segnalazione Share Pubblicato: 30 Novembre 2006 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 More sharing options...
Il.Socio Pubblicato: 1 Dicembre 2006 Segnalazione Share Pubblicato: 1 Dicembre 2006 (modificato) 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 1 Dicembre 2006 da Il.Socio Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 1 Dicembre 2006 Autore Segnalazione Share Pubblicato: 1 Dicembre 2006 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 More sharing options...
Il.Socio Pubblicato: 1 Dicembre 2006 Segnalazione Share Pubblicato: 1 Dicembre 2006 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... Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 1 Dicembre 2006 Autore Segnalazione Share Pubblicato: 1 Dicembre 2006 grazie per le dritte. ora mi informo un pò... Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 1 Dicembre 2006 Autore Segnalazione Share Pubblicato: 1 Dicembre 2006 (modificato) mi sa che la chiave della questione è questa proprietà di socket: socket.gethostbyname(socket.gethostname()) che mi sembra anche molto simile al ResolveAddress che mi suggerivi Modificato 1 Dicembre 2006 da Enzo74 Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 1 Dicembre 2006 Autore Segnalazione Share Pubblicato: 1 Dicembre 2006 ok risolto: bisogna prima definire l'host e poi ricavarne l'ip mediante: hostname = socket.gethostname() ip = socket.gethostbyname(hostname) posto un esempio pratico che si basa su questo nella consueta discussione... Link to comment Condividi su altri siti More sharing options...
Il.Socio Pubblicato: 2 Dicembre 2006 Segnalazione Share Pubblicato: 2 Dicembre 2006 (modificato) 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 2 Dicembre 2006 da Il.Socio Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 2 Dicembre 2006 Autore Segnalazione Share Pubblicato: 2 Dicembre 2006 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 More sharing options...
Il.Socio Pubblicato: 2 Dicembre 2006 Segnalazione Share Pubblicato: 2 Dicembre 2006 (modificato) 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 2 Dicembre 2006 da Il.Socio Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 2 Dicembre 2006 Autore Segnalazione Share Pubblicato: 2 Dicembre 2006 hai centrato in pieno il meccanismo. purtroppo con l'ip dinamico chi ha il server deve comunicare in qualche modo il suo ip (noi lo facevamo per sms). Link to comment Condividi su altri siti More sharing options...
Il.Socio Pubblicato: 3 Dicembre 2006 Segnalazione Share Pubblicato: 3 Dicembre 2006 (modificato) 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 3 Dicembre 2006 da Il.Socio Link to comment Condividi su altri siti More sharing options...
Enzo74 Pubblicato: 3 Dicembre 2006 Autore Segnalazione Share Pubblicato: 3 Dicembre 2006 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 More sharing options...
Enzo74 Pubblicato: 3 Dicembre 2006 Autore Segnalazione Share Pubblicato: 3 Dicembre 2006 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 More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Accedi Ora