Autore Topic: Info TCP server  (Letto 6979 volte)

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Info TCP server
« Risposta #15 il: 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:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #16 il: 02 Dicembre 2011, 11:05:20 »
potrebbe essere che il tuo router abbia delle politiche di blocco di alcune porte?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #17 il: 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

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Info TCP server
« Risposta #18 il: 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.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #19 il: 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)

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Info TCP server
« Risposta #20 il: 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)

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #21 il: 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

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #22 il: 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)

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Info TCP server
« Risposta #23 il: 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)





Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #24 il: 02 Dicembre 2011, 14:52:52 »
perfetto

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Info TCP server
« Risposta #25 il: 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?

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Info TCP server
« Risposta #26 il: 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?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Info TCP server
« Risposta #27 il: 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

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Info TCP server
« Risposta #28 il: 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.

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Info TCP server
« Risposta #29 il: 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?