Allora, rifacendomi all'esempio del server TCP, ho provato questo codice:
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:
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.
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!!!!
READ #LAST, sBuf, LEN(sBuf)
Allora, in VisualBasic ho una cosa del tipo:
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
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):
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)
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:
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:
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?
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:
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?
Magari voi ci capite qualcosa.
Acquisizione fatta con wireshark 1.6.8 su Windows, server TCP porta 29:
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):
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:
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)