Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: El Berto - 05 Gennaio 2011, 15:52:33

Titolo: Info TCP server
Inserito da: El Berto - 05 Gennaio 2011, 15:52:33
Ciao a tutti, sono nuovo del forum.
Prima (e anche adesso) lavoravo con Visual Basic; mi tocca però passare a un sistema Linux.
Sto provando a fare dei piccoli programmini con protocollo TCP/IP.

Ho provato a eseguire questo piccolo programma di esempio:

Citazione
' Gambas class file
STATIC Server AS ClsServer
PUBLIC Clients AS Object[]
PUBLIC Srv AS ServerSocket

PUBLIC SUB Socket_Read()

  DIM sCad AS String
  READ #LAST,sCad,Lof(LAST)
  PRINT "Received data -->" & sCad
  WRITE #LAST,"bye",3

END

PUBLIC SUB Socket_Closed()

  PRINT "Connection closed"
  Clients.Remove(Clients.Find(LAST))

END

PUBLIC SUB Srv_Connection(Host AS String)

  DIM MySock AS Socket
  PRINT "Accepting connection from --> " & Host
  MySock=Srv.Accept()
  Clients.Add(MySock)

END

PUBLIC SUB _New()

  Clients =NEW Object[]
  Srv=NEW ServerSocket AS "Srv"
  Srv.Port=3450
  Srv.Type=ServerSocket.Internet
  Srv.Listen()

END

STATIC PUBLIC SUB Main()

  Server=NEW ClsServer

END

Ma durante la compilazione mi compare l'errore:

"Unknown identifier: ClsServer"

Dov'è che ho sbagliato?
Grazie.
Titolo: Re: Info TCP server
Inserito da: Francoiky - 05 Gennaio 2011, 18:43:22
Prima di tutto ti conviene fare una cosa:
. vai in Gambas;
. poi Strumenti>Preferenze;
. qui vai su Editor;
. imposti "Mostra i numeri di linea" su "Si";
Impostati i numeri di linea, :
. premi F5 (per eseguire);
. nel messaggio di errore guardi la linea;
. la posti sul forum.

Forse poi qualcuno potrà aiutarti ;)
Titolo: Re: Info TCP server
Inserito da: Ceskho - 06 Gennaio 2011, 01:24:00
Stai cercando di creare un oggetto Server ereditandolo da uno di tipo ClsServer. Quest'ultimo esiste? E una classe che hai creato tu? È un modulo? cos'è? Sicuro che il codice giusto non sia:

STATIC ClsServer AS Server?

Hai abilitato il componente di rete?
Titolo: Re: Info TCP server
Inserito da: doublemm - 06 Gennaio 2011, 17:58:46
Citazione
mi tocca però passare a un sistema Linux.


 >:( :evil: :bad: :hard: ??? :poke: :death: :devil: :skull: :nonono: :violent:

 :)
Titolo: Re: Info TCP server
Inserito da: Ceskho - 06 Gennaio 2011, 21:24:03
Citazione
mi tocca però passare a un sistema Linux.


 >:( :evil: :bad: :hard: ??? :poke: :death: :devil: :skull: :nonono: :violent:

 :)


Mi era sfuggita quella frase altrimenti lo bannavo.... ;D
Titolo: Re: Info TCP server
Inserito da: dex - 06 Gennaio 2011, 23:15:53
Citazione
mi tocca però passare a un sistema Linux.


 >:( :evil: :bad: :hard: ??? :poke: :death: :devil: :skull: :nonono: :violent:

 :)


Mi era sfuggita quella frase altrimenti lo bannavo.... ;D

che cattivi!!!!

sicuramente il poverino è stato costretto a passare a linux dai virus e i continui blocchi di windows
Titolo: Re: Info TCP server
Inserito da: leo72 - 07 Gennaio 2011, 14:06:59
Cari confratelli, accogliamo con gioia il caro fratello El Berto che, illuminato come San Paolo sulla via di Damasco, si aggiunge a noi adoratori del Sacro Gambero del Pinguino abbandonando i sistemi operativi pagani. Amen.  :-*
Titolo: Re: Info TCP server
Inserito da: El Berto - 10 Gennaio 2011, 09:38:22
Innanzitutto, grazie per il benvenuto.
Poi, Windows (nello specifico Visual Studio) qualche qualità ce l'aveva; se non altro riuscivo a trovare gli esempi in rete.
Oggi volevo installare Firefox su Linux ma ci ho rinunciato.

Comunque, tornando al problema, io "dovrei" aver abilitato tutti i moduli necessari:

Project -> Properties -> Components
ho abilitati Gb.net e Gb.net.curl

L'errore è sempre:
"Unknown identifier: ClsServer"
Anche se dichiaro "As Server" non cambia niente.
Io l'esempio l'ho copiato come l'ho trovato.
Titolo: Re: Info TCP server
Inserito da: leo72 - 10 Gennaio 2011, 10:17:33
1) Windows ha un pregio: quello di portare la gente a provare altri SO  ;D

2) Per installare Firefox non devi far altro che usare il package manager della distro che usi. Quale distro usi?

3) Non ho capito bene se stai provando un esempio di Gambas oppure se hai copiato del codice trovato da qualche parte. Cmq l'errore è chiaro: ti dice che non hai creato quella classe, clsServer.
Titolo: Re: Info TCP server
Inserito da: El Berto - 10 Gennaio 2011, 12:02:35
Allora, io uso l'ultima di Slackware (mi sembra la 13).

Il codice l'ho copiato direttamente da una pagina web dove parlava di Server/Client in Gambas.

Ci sono esempi di Gambas da vedere/scaricare da qualche parte?

Che la classe ClsServer non è creata lo sospettavo anch'io, come faccio?
Titolo: Re: Info TCP server
Inserito da: leo72 - 10 Gennaio 2011, 22:06:57
Gambas integra già degli esempi: quando appare Gambas con la schermata di scelta dell'applicazione da aprire seleziona dal menu grafico a SX "Esempi" ed aprine uno inerente l'interfacciamento.

Per quanto riguarda quella classe mancante, devi tornare su quel sito e procurarti i file mancanti. Mica puoi "inventartela"  ;)
Titolo: Re: Info TCP server
Inserito da: Diakrufus - 12 Gennaio 2011, 11:28:24
Allora, io uso l'ultima di Slackware (mi sembra la 13).

Il codice l'ho copiato direttamente da una pagina web dove parlava di Server/Client in Gambas.

Ci sono esempi di Gambas da vedere/scaricare da qualche parte?

Che la classe ClsServer non è creata lo sospettavo anch'io, come faccio?

Ciao El Berto, un consiglio da uno che usa come distro Debian da moltissimi anni, ma ha usato quasi tutte le distro più famose in linux Gentoo, Red Hat,Slackware, Mandrake  ed altre. Cercati una distro che si avvicina di più al tuo mondo cioè più simile a windows, che ti carichi già inpartenza quasi tutto anche Firefox. Perchè non per offenderti la Slackware è un po ostica per un principiante che si avvicina a Gnu-Linux. Ti consiglio l'ultima realise di Ubuntu.
Titolo: Re: Info TCP server
Inserito da: El Berto - 23 Novembre 2011, 14:30:12
Dopo un po' di tempo riesco finalmente a tornare a lavorare su Gambas.

Dando un'occhiata agli esempi di Gambas...... ma il ServerSocket gestisce già implicitamente più client contemporanei?
Titolo: Re: Info TCP server
Inserito da: El Berto - 30 Novembre 2011, 16:44:25
Allora, rifacendomi all'esempio del server TCP, ho provato questo codice:

Codice: [Seleziona]
 
PUBLIC SUB Form_Open()
 Client = NEW Object[]
 Server.Type = Net.Internet
 Server.Port = 27 ' porta
 Server.Listen(0)
 TextArea1.Text = TextArea1.Text & "Server started!" & Chr(13) & Chr(10)
END

E puntualmente ho l'errore:

Citazione
  Message.Error("Unable to bind socket")

Potreste spiegarmi dov'è che sbaglio? A me sembra uguale alla parte dell'esempio (eccetto il fatto che non scelgo la modalità UNIX o TCP)...
Grazie.
Titolo: Re: Info TCP server
Inserito da: El Berto - 02 Dicembre 2011, 09:56:19
Allora, ho provato con le porte:
29 -> "Unable to bind socket"
292 -> "Unable to bind socket"

2000 -> Funziona

Ci sono valori di porta riservati?
Titolo: Re: Info TCP server
Inserito da: andy60 - 02 Dicembre 2011, 10:30:52
Cari confratelli, accogliamo con gioia il caro fratello El Berto che, illuminato come San Paolo sulla via di Damasco, si aggiunge a noi adoratori del Sacro Gambero del Pinguino abbandonando i sistemi operativi pagani. Amen.  :-*

grandissima frase, mi hai fatto sorridere in questo tetro mattino di venerdi' targhe alterne di roma :rotfl:
Titolo: Re: Info TCP server
Inserito da: fsurfing - 02 Dicembre 2011, 11:05:20
potrebbe essere che il tuo router abbia delle politiche di blocco di alcune porte?
Titolo: Re: Info TCP server
Inserito da: fsurfing - 02 Dicembre 2011, 11:08:24
forse mi sbaglio, ma mi pare di ricordare che la selezione tcp/ip o unix sia importante, per far capire al sw se stausando una rete locale o wan
Titolo: Re: Info TCP server
Inserito da: El Berto - 02 Dicembre 2011, 11:38:57
Ipotizzo che ci siano delle porte riservate o meno in base al fatto che si utilizzi un socket Unix o Tcp, del tipo porte da 1 a 1999 per socket Unix e da 2000 in poi per socket Tcp, ma mi sembra un po' strano....
In rete non ho trovato niente a riguardo.
Titolo: Re: Info TCP server
Inserito da: fsurfing - 02 Dicembre 2011, 11:48:44
io tempo fa avevo fatto delle prove server/client e il tutto funzionava a meraviglia in lan, ricordo che come porta usavo sicuramente qualcosa superiore al 2000, poi i test li ho lasciati perdere perchè chi avevo interpellato dall'altra parte (internet) non riusciva a sbloccare le porte del router di alice e quindi la comunicazione non si instaurava, (il nat non sapevo come implementarlo)
Titolo: Re: Info TCP server
Inserito da: El Berto - 02 Dicembre 2011, 12:23:42
Comunque, studiando gli esempi non mi tornano i conti, il mio sistema (attuale su Windows) è una cosa di questo tipo:

- Client: Richiesta temperature interne
- Server: Trasmissione dati temperature interne
- Client: Richiesta temperature esterne
- Server: Trasmissione dati temperature esterne
- Client: Richiesta stato sistema
- Server: Trasmissione dati stato sistema
- chiusura del socket

Quindi in una stessa connessione ci sono 3 trasmissioni dati.

Ora, con l'utilizzo di più client contemporaneamente e la keyword "LAST", non è che mischio l'ordine dei client, ovvero effettuo la prima trasmissione con il primo client che ricevo, poi effettuo la seconda trasmissione dati con un secondo client a cui mi sono connesso dopo?
Oppure, fino a quando non chiudo il socket con il primo client, il secondo viene messo in attesa?


P.S.
Qualcuno mi può dire come leggere uno stream e metterlo in un array di Bytes?
In tutto gli esempi che trovo i dati vengono messi in una stringa!!!!
Codice: [Seleziona]
READ #LAST, sBuf, LEN(sBuf)
Titolo: Re: Info TCP server
Inserito da: fsurfing - 02 Dicembre 2011, 12:42:31
dovrei vedere il codice che usi , in linea di massima il server dovrebbe avere un array di client, percui quando un client interroga il server la risposta vien espedita solo a quel client , questo perchè i vari client hanno ip differenti, se avessero lo stesso ip riceverebbero tutti la risposta.

per ricever solo array di byte non spreii, credo ti dovrebbe bastare:



READ #LAST, sBuf, 1

b.add(sBuf)


ma così hai un array di caratteri
Titolo: Re: Info TCP server
Inserito da: fsurfing - 02 Dicembre 2011, 12:47:14
se vuoi mi mandi i sorgenti e faccio delle prove anche io , o ci possiamo sentire su msn e far dialogare client/server  (mandami indirizzo in privato)
Titolo: Re: Info TCP server
Inserito da: El Berto - 02 Dicembre 2011, 14:50:18
Allora, in VisualBasic ho una cosa del tipo:

Codice: [Seleziona]
NetworkStream = TcpClient.GetStream()

NetworkStream.ReadBytes (RxBuffer, 0, 32) ' legge 32 bytes dallo stream in ricezione dal server

Dove RxBuffer è un array di tipo Byte, quindi il contenuto è una cosa del tipo: 0x22, 0x24, 0x00, 0xFF, .......

Visto che in Gambas mi sembra tutti gli stream vengono letti come stringhe
Codice: [Seleziona]
 DIM sBuf AS String
READ #LAST, sBuf, Lof(LAST) ' leggo lo stream in ingresso, ma lo leggo come stringa

allora, per ottenere il mio array di byte (o di integer) ho proceduto come segue (non penso sia il metodo più efficace, ma funziona):
Codice: [Seleziona]
  DIM sBuf AS String
    DIM tis AS Byte
    DIM iCount AS Integer
    DIM Length AS Integer

  Length = Lof(LAST)
  READ #LAST, sBuf, Length ' leggo lo stream in ingresso
 
  FOR iCount = 1 TO Length STEP 1
        RxData[iCount - 1] = Asc(sBuf, iCount) ' con RxData AS Byte[32]
  NEXT

' adesso ho il mio buffer di ricezione contenente i dati in ingresso (in Byte)




Titolo: Re: Info TCP server
Inserito da: fsurfing - 02 Dicembre 2011, 14:52:52
perfetto
Titolo: Re: Info TCP server
Inserito da: El Berto - 02 Dicembre 2011, 15:22:28
Niente da fare: ho provato a sincronizzare 3 client in modo che mi trasmettessero contemporaneamente e come temevo ecco cosa mi succede con il LAST:

Codice: [Seleziona]
Socket number 0,  ID client 1Bh,  request data code  1
Socket number 1,  ID client 21h,  request data code  1
Socket number 0,  ID client 1Bh,  request data code  2
Socket number 1,  ID client 21h,  request data code  2
Socket number 2,  ID client 1Dh,  request data code  1
Socket number 0,  ID client 1Bh,  request data code  3
Socket number 1,  ID client 21h,  request data code  3
Socket number 2,  ID client 1Dh,  request data code  2

mi si mischiano gli stream; io vorrei una cosa che mi mette in coda gli stream, come FIFO:
Codice: [Seleziona]
Socket number 0,  ID client 1Bh,  request data code  1
Socket number 0,  ID client 1Bh,  request data code  2
Socket number 0,  ID client 1Bh,  request data code  3

Socket number 1,  ID client 1Dh,  request data code  1
Socket number 1,  ID client 1Dh,  request data code  2
Socket number 1,  ID client 1Dh,  request data code  3

Socket number 2,  ID client 21h,  request data code  1
Socket number 2,  ID client 21h,  request data code  2
Socket number 2,  ID client 21h,  request data code  3


Qualche idea?
Titolo: Re: Info TCP server
Inserito da: El Berto - 16 Gennaio 2012, 14:40:50
Ragazzi, ho un dubbio sulla gestione del multithreading.....
In pratica, quando mi arrivano dei dati TCP ho un array (buffer) che vado a leggere e da cui estraggo dei dati, quindi procedo a processarli.
Se io ho la mia funzione:

Codice: [Seleziona]
PUBLIC SUB Socket_Read()

' Qui ho appena letto i dati dal buffer di ricezione

' Procedo a elaborare i dati
Elabora_Dati1()
Elabora_Dati2()

mi sorge il dubbio che Elabora_Dati1() mi venga chiamata quando si connette il primo client, ma poi potrei avere un secondo client che mi chiama la funzione Elabora_Dati1() quando è ancora in esecuzione per il primo client....
E' possibile?
Titolo: Re: Info TCP server
Inserito da: fsurfing - 17 Gennaio 2012, 18:47:11
dipende da quanto è lunga l' elaborazione..

direi che l' unica cosa da fare è provare, o in alternativa creare una nuova istanza di una classe elaboradati per ogni evento
Titolo: Re: Info TCP server
Inserito da: md9327 - 19 Gennaio 2012, 14:47:10
Come accennato da fsurfing, il problema è che usi un'unico evento per tutti gli stream.
Ovviamente questo, se non opportunamente gestito, da adito ad accavallamenti incasinando l'analisi.
Le soluzioni sono due, dipendentemente dallo stato attuale delle cose:

1) modificare i tracciati dei dati in modo da identificare chi ha inviato il dato;
2) per ogni stream creare un proprio evento.

Gambas non è multithread, per cui gestire eventuali semafori o perdite di buffer è compito del programmatore.
A suo tempo usavo dei buffer che catturavano l'input senza analizzarlo. Dopodiche, con un interrupt, analizzavo i buffer con comodo.
Titolo: Re: Info TCP server
Inserito da: El Berto - 31 Maggio 2012, 15:16:48
Allora, rifacendomi all'esempio del server TCP, ho provato questo codice:

Codice: [Seleziona]
 
PUBLIC SUB Form_Open()
 Client = NEW Object[]
 Server.Type = Net.Internet
 Server.Port = 27 ' porta
 Server.Listen(0)
 TextArea1.Text = TextArea1.Text & "Server started!" & Chr(13) & Chr(10)
END

E puntualmente ho l'errore:

Citazione
  Message.Error("Unable to bind socket")

Potreste spiegarmi dov'è che sbaglio? A me sembra uguale alla parte dell'esempio (eccetto il fatto che non scelgo la modalità UNIX o TCP)...
Grazie.



Ho scoperto che lanciando il server sulla porta 29 come "root" non mi compare l'errore "Unable to bind socket".

Qualche problema di permissions?
Titolo: Re: Info TCP server
Inserito da: md9327 - 31 Maggio 2012, 18:13:05
In realtà sulle porte, i problemi potresti incontrarli tra le macchine e non con le utenze sulla stessa...
Questo a meno che la porta non sia attualmente usata da qualche altro servizio...
Titolo: Re: Info TCP server
Inserito da: El Berto - 31 Maggio 2012, 18:25:22
La porta era stata scelta 29 proprio perchè era libera, e in Windows ha sempre funzionato.
I problemi li ho incontrati passando con Gambas (Ubuntu).
Poi ho provato oggi, giusto per sfizio, a lanciare il server come root, sulla porta 29 e non mi ha più messo errore.
Se però lancio Gambas come sudo, allora il server parte sulla porta 29, ma dall'esterno non riesco a collegarmi.
Il firewall è disabilitato.
C'è qualche modo per vedere i processi e le porte che eventualmente utilizzano?
Titolo: Re: Info TCP server
Inserito da: pastrank - 31 Maggio 2012, 20:44:18
La porta era stata scelta 29 proprio perchè era libera, e in Windows ha sempre funzionato.
I problemi li ho incontrati passando con Gambas (Ubuntu).

Sotto la 1024 se e' un processo utente, non viene permesso: e' forse un tentativo di aumentare la sicurezza retaggio del passato, ma tant'e' , non ti viene permesso.
Titolo: Re: Info TCP server
Inserito da: El Berto - 04 Luglio 2012, 14:20:58
Allora, non sono riuscito a cambiare la porta TCP.
L'unica cosa che mi rimaneva da fare è quella di lanciare il server come utente root.

Riesco correttamente a ricevere i dati, tutto contento....... e poi si ferma tutto.
Come se non mi arrivasse più niente.
Provo a chiedere i log del traffico al sistemista e lui mi conferma che i pacchetti arrivano alla mia macchina.
Solo che, anche se metto dei breakpoint all'interno del programma, non succede niente.

E'possibile che vi sia un qualche genere di bug, magari risolto in Gambas3?
La cosa che non capisco è che usando la porta 2000 funziona perfettamente.....
Titolo: Re: Info TCP server
Inserito da: pastrank - 04 Luglio 2012, 19:19:45
Allora, non sono riuscito a cambiare la porta TCP.

Ovvero? Intendi questo?

Server.Port = 27 ' porta
Titolo: Re: Info TCP server
Inserito da: El Berto - 05 Luglio 2012, 11:40:26
No, intendo dire che per campiare la porta TCP devo andare fisicamente su tutti i client, ricompilare con una porta TCP diversa dalla 29 e riscrivere il firmware.
Quindi devo per forza riuscire a lavorare con un server sulla porta 29.

Proprio non capisco perchè mi da problemi la porta 29 (con la 2000 funziona sempre); addirittura sono costretto a riavviare il computer perchè poi mi ricompare "unable to bind socket".
Titolo: Re: Info TCP server
Inserito da: El Berto - 05 Luglio 2012, 12:22:05
Magari voi ci capite qualcosa.

Acquisizione fatta con wireshark 1.6.8 su Windows, server TCP porta 29:
Codice: [Seleziona]
      9 11:25:20.0 192.168.81.220        158.110.30.62         TCP      60     ismc > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     10 11:25:20.0 158.110.30.62         192.168.81.220        TCP      58     msg-icp > ismc [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460
     11 11:25:20.0 192.168.81.220        158.110.30.62         TCP      60     ismc > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     12 11:25:20.0 192.168.81.220        158.110.30.62         TCP      106    ismc > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     13 11:25:20.0 158.110.30.62         192.168.81.220        TCP      62     msg-icp > ismc [PSH, ACK] Seq=1 Ack=53 Win=65483 Len=8
     14 11:25:20.0 192.168.81.220        158.110.30.62         TCP      60     ismc > msg-icp [ACK] Seq=53 Ack=9 Win=32 Len=0

Acquisizione fatta con wireshark 1.2.11 su Ubuntu, server TCP porta 29 (esempio funzionante):
Codice: [Seleziona]
      9 11:44:05.6 192.168.81.220        158.110.30.62         TCP      cert-initiator > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     10 11:44:05.6 158.110.30.62         192.168.81.220        TCP      msg-icp > cert-initiator [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460
     11 11:44:05.6 192.168.81.220        158.110.30.62         TCP      cert-initiator > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     12 11:44:05.7 192.168.81.220        158.110.30.62         TCP      cert-initiator > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     13 11:44:05.7 158.110.30.62         192.168.81.220        TCP      msg-icp > cert-initiator [ACK] Seq=1 Ack=53 Win=5840 Len=0
     14 11:44:05.8 158.110.30.62         192.168.81.220        TCP      msg-icp > cert-initiator [PSH, ACK] Seq=1 Ack=53 Win=5840 Len=8
     15 11:44:05.9 192.168.81.220        158.110.30.62         TCP      cert-initiator > msg-icp [ACK] Seq=53 Ack=9 Win=32 Len=0

Acquisizione fatta su Ubuntu, quando si presenta il problema:
Codice: [Seleziona]
     13 19:32:07.9 192.168.81.220        158.110.30.62         TCP      60     4290 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     14 19:32:07.9 192.168.81.220        158.110.30.62         TCP      60     4290 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     15 19:32:08.0 192.168.81.220        158.110.30.62         TCP      106    4290 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     16 19:32:08.4 192.168.81.220        158.110.30.62         TCP      60     4290 > msg-icp [ACK] Seq=53 Ack=9 Win=32 Len=0
(trasmissione funzionante)

     45 19:50:55.1 192.168.81.220        158.110.30.62         TCP      60     4291 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     46 19:50:55.1 192.168.81.220        158.110.30.62         TCP      60     4291 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     47 19:50:55.2 192.168.81.220        158.110.30.62         TCP      106    4291 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     48 19:50:55.5 192.168.81.220        158.110.30.62         TCP      60     4291 > msg-icp [ACK] Seq=53 Ack=9 Win=32 Len=0
(ultima trasmissione funzionante)
 
     69 20:09:42.3 192.168.81.220        158.110.30.62         TCP      60     4292 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     70 20:09:42.3 192.168.81.220        158.110.30.62         TCP      60     4292 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     71 20:09:42.4 192.168.81.220        158.110.30.62         TCP      106    4292 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     72 20:09:42.4 192.168.81.220        158.110.30.62         TCP      60     4292 > msg-icp [FIN, ACK] Seq=53 Ack=2 Win=32 Len=0
     73 20:09:42.4 192.168.81.220        158.110.30.62         TCP      60     4292 > msg-icp [RST] Seq=54 Win=32 Len=0
     74 20:09:42.4 192.168.81.220        158.110.30.62         TCP      60     4293 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     75 20:09:42.4 192.168.81.220        158.110.30.62         TCP      60     4293 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     76 20:09:42.5 192.168.81.220        158.110.30.62         TCP      106    4293 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     77 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4293 > msg-icp [FIN, ACK] Seq=53 Ack=2 Win=32 Len=0
     78 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4294 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     79 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4293 > msg-icp [RST] Seq=54 Win=32 Len=0
     80 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4294 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     81 20:09:42.5 192.168.81.220        158.110.30.62         TCP      106    4294 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     82 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4294 > msg-icp [FIN, ACK] Seq=53 Ack=2 Win=32 Len=0
     83 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4295 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     84 20:09:42.5 192.168.81.220        158.110.30.62         TCP      60     4294 > msg-icp [RST] Seq=54 Win=32 Len=0
     85 20:09:42.6 192.168.81.220        158.110.30.62         TCP      60     4295 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     86 20:09:42.6 192.168.81.220        158.110.30.62         TCP      106    4295 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     87 20:09:42.6 192.168.81.220        158.110.30.62         TCP      60     4295 > msg-icp [FIN, ACK] Seq=53 Ack=2 Win=32 Len=0
     88 20:09:42.6 192.168.81.220        158.110.30.62         TCP      60     4295 > msg-icp [RST] Seq=54 Win=32 Len=0
     89 20:09:42.6 192.168.81.220        158.110.30.62         TCP      60     4296 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     90 20:09:42.6 192.168.81.220        158.110.30.62         TCP      60     4296 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
     91 20:09:42.7 192.168.81.220        158.110.30.62         TCP      106    4296 > msg-icp [PSH, ACK] Seq=1 Ack=1 Win=32 Len=52
     92 20:09:42.7 192.168.81.220        158.110.30.62         TCP      60     4296 > msg-icp [FIN, ACK] Seq=53 Ack=2 Win=32 Len=0
     93 20:09:42.7 192.168.81.220        158.110.30.62         TCP      60     4296 > msg-icp [RST] Seq=54 Win=32 Len=0
     94 20:09:42.7 192.168.81.220        158.110.30.62         TCP      60     4297 > msg-icp [SYN] Seq=0 Win=32 Len=0 MSS=576
     95 20:09:42.7 192.168.81.220        158.110.30.62         TCP      60     4297 > msg-icp [ACK] Seq=1 Ack=1 Win=32 Len=0
(e continua così con la stessa sequenza che si ripete: secondo il server TCP di Gambas, neanche ricevo la comunicazione)
Titolo: Re: Info TCP server
Inserito da: pastrank - 05 Luglio 2012, 22:03:33
Magari voi ci capite qualcosa.

Io :nono:, ma ti ripeto la storia per cui le porte sotto 1024 non possono essere usate con Linux nei processi utente. A parte che a questo punto, pur rileggendo il thread, non capisco piu' quello che dicevi di dover fare... dunque, volevi comunicare con dei dispositivi, esterni alla tua lan e quindi su internet, che sono i client, dotati di firmware non modificabile perche' se no modificheresti la porta, e devono comunicare con il server che sta sul tuo pc.
Quindi, dal router, le richieste sulla porta 29 che giungono dall'esterno devono essere nattate e indirizzate verso l'ip del pc dove hai il server, con una procedura analoga a quella che si fa con i programmi di file sharing. Per il server, hai quindi piu' alternative: o continui ad usare la 29, eseguendolo come root, o puoi creare una regola con iptables che trasli la porta 29 in 2xxxx e usarlo cosi', piu' sicuramente varie che non mi sovvengono.
Titolo: Re: Info TCP server
Inserito da: pastrank - 05 Luglio 2012, 22:31:31
le richieste sulla porta 29

A proposito, leggo che la porta 29 potrebbe essere impegnata...
http://www.debianhelp.co.uk/ports.htm (http://www.debianhelp.co.uk/ports.htm)
Titolo: Re: Info TCP server
Inserito da: El Berto - 06 Luglio 2012, 00:48:12
Eh, fare il NAT è un po' un casino.....
Mi sa che mi tocca aspettare di avere il nuovo hardware con il firmware che usa la porta 2000.

Mi è venuta in mente un'altra cosa, non so se sono O.T.:
il client si collega al server, e visto che ha un buffer limitato, per trasmettere dati lo fa a più riprese (trasmette il client, risponde il server, trasmette nuovamente il client, risponde nuovamente il server.....).
Nella finestra di dialogo (ho preso l'esempio ServerSocket) ho "Socket number x..." e poi c'è lo scambio di dati.
Dovrei prevedere che il server si pianta, quindi il client dovrebbe avere un timeout che se il server non risponde entro un certo tempo, chiude la connessione.
Ma devo anche fare l'opposto: se è il client a piantarsi, devo chiudere il socket del server.
Uso un timer che azzero ognivolta (nella sub Socket_Read) che mi arrivano dei dati.
Quando mi scatta il timer, cioè il timeout, mi basta chiamare "Socket_Closed"?
Titolo: Re: Info TCP server
Inserito da: pastrank - 06 Luglio 2012, 09:36:09
Eh, fare il NAT è un po' un casino.....
Mi sa che mi tocca aspettare di avere il nuovo hardware con il firmware che usa la porta 2000.

Avere le porte necessarie visibili dall'esterno tramite nat - o come lo chiama il tuo router - dovrebbe essere condizione necessaria per gestire un server... per esempio, il web server lighttpd, che ho su questo pc, senza nat, non e' raggiungibile dall'esterno. Farlo e' semplicissimo, ammesso di non avere un router blindato o essere nattati in una rete tipo Fastweb, puoi vedere gli esempi su www.portforward.com (http://www.portforward.com).

Quando mi scatta il timer, cioè il timeout, mi basta chiamare "Socket_Closed"?

Con i socket mi sono limitato a fare qualche prova, meglio lo dica qualcuno piu' esperto di me qual'e' la procedura corretta :-)
Titolo: Re: Info TCP server
Inserito da: El Berto - 13 Febbraio 2013, 15:32:18
Ho un server TCP che accetta connessioni da client remoti; ad un certo punto voglio terminare la connessione, quindi vorrei che il server "sbattesse" fuori alcuni client.
Per fare una prova ho deciso di chiudere TUTTE le connessioni, quindi faccio Client.Close(0) finchè non mi dice che Client è vuoto.
Ora, con il comando

Codice: [Seleziona]
netstat -anp --tcp

mi ritrovo che lo stato della connessione è "FIN_WAIT1" anche dopo che ho chiuso tutti i socket.
Sapreste spiegarmi come mai?