Newsgroup: it.comp.lang.delphi
Titolo: Socket Blocked

Ciao a tutti,
	sto realizzando un'applicazione che deve consentire lo scambio di pacchetti via socket in multithreading su client diversi. L'applicazione attualmente utilizza i socket non bloccanti e l'accesso di più client riduce drasticamente le prestazioni della procedura. Il singolo accesso non genera problemi. Riducendo i pacchetti inviati la procedura si velocizza estremamente. 
	Ho provato a implentare una piccola applicazione client/server con socket bloccanti e non mi funziona nulla, o almeno si pianta tutto. Inoltre non c'è una virgola di documentazione ne sui manuali di borland ne altrove.
	Sapete come aiutarmi ovvero avete links o info dove documentarsi riguardo ai socket bloccanti?
	grazie fin d'ora...
		Ciao

 documentarsi riguardo ai socket bloccanti?
Se l'applicazione non è già ad uno stadio troppo avanzato ti consiglio di
cambiare componenti.
Se un esempio è quello di cui hai bisogno te ne passo uno. E' preso da un
mio programma di controllo remoto per ottenere l'immagine del desktop della
macchina a cui sono connesso.
La connessione è del tipo sincrona/bloccante.
Lato Client
var
  Stream: TWinSocketStream;
  Buffer: Array [0..9999] of Byte;
  MemoryStream: TMemoryStream;
  Received: Integer;
  JPeg : TJpegImage;
begin
  Form1.ClientSocket1.Socket.SendText('#D1_'+IntToStr(Trackbar1.position));
  Form1.ClientSocket2.Active:=True;
  JPeg := TJpegImage.Create;
  Stream:= TWinSocketStream.Create ( Form1.ClientSocket2.Socket, 360000 );
  MemoryStream:= TMemoryStream.Create;
  try
    if Stream.WaitForData ( 360000 ) then
    begin
      while True do
      begin
        Received:= Stream.Read ( Buffer, SizeOf ( Buffer ) );
        MemoryStream.Write ( Buffer, Received );
        if Received <= 0 then
          break;
       end;
       MemoryStream.Position:= 0;
       JPeg.LoadFromStream ( MemoryStream );
       JPeg.SaveToFile(WindowDir+'\screenshot.jpg');
       Image1.Picture.Assign(Jpeg);
    end;
  finally
    Stream.Free;
    JPeg.Free;
    MemoryStream.Free;
    Form1.ClientSocket2.Active:= False;
  end;
end;
Lato Server
Stream:= TWinSocketStream.Create( ServerSocket2.Socket.Connections[0],
360000 );
try
   Jpg.LoadFromFile( WinDirectory + '\snapshot.jpeg' );
   Jpg.SaveToStream ( Stream );
finally
   Stream.Free;
   ServerSocket2.Socket.Connections[0].Close;
end;
FreeMem(WinDirectory);
Jpg.Free;
--
- Carlo -

socket bloccanti e non mi funziona nulla, o almeno si pianta tutto.
Se ho capito bene quello che vuoi fare, parlare di socket "bloccante"
e di "pacchetto" è una contraddizione.  A mio avviso, puoi usare i
socket in modalità non bloccante e inserire nella trasmissione, alla
stregua di quanto fa lo stack TCP/IP, delle informazioni per il
recupero dei pacchetti nell'ordine corretto e per la ricostituzione
del file originale.
P.S.: imposta il tuo nr perché rispetti gli standard sulla
formattazione del testo, le linee dei tuoi messaggi sono troppo
lunghe.
-- 
Andrea Laforgia
"God is dead." -- Nietzsche
"Nietzsche is dead." -- God

 pacchetti via socket in multithreading su client diversi.
Ciao Massimo!!!!! ^___^
In bocca al lupo, stai giocando con il fuoco :)
--
Jax
Journeying Artificial Xenomorph

Lo so Jax... 
Mi rimandi la tua mail per cortesia...
PS. Ormai sono da Centro Grandi Ustioni :)
-----Messaggio originale-----
Da: Jax [mailto:
rispo...@newsgroup.grazie
] 
Inserito: martedì 18 febbraio 2003 9.23
Inserito in: delphi
Conversazione: Socket Blocked
Oggetto: Re: Socket Blocked


Beh, perdona il vocabolario errato :)
Questa gestione dei pacchetti non ci serve per inviare files ma per comunicare lo stato di due applicazioni (un servizio lato server e un'applicazione lato client)... Il problema è che nel caso di connessioni stNonBlocking se ho più di due client il tutto si rallenta mostruosamente... 
Abbiamo già fatto delle prove oggi per vedere la stabilità dell'altra soluzione (ovvero quella stThreadBlocking) e ci pare più sicura... Inoltre siccome abbiamo dei thread che monitorano delle cartelle dove vengono effettuate dei put ftp possiamo relazionare direttamente (in questo modo) dei thread socket con i thread di controllo. 
In ogni caso ti ringrazio per l'aiuto...
-----Messaggio originale-----
Da: Andrea Laforgia [mailto:
x@x.x
] 
Inserito: lunedì 17 febbraio 2003 22.48
Inserito in: delphi
Conversazione: Socket Blocked
Oggetto: Re: Socket Blocked


 PS. Ormai sono da Centro Grandi Ustioni :)
Thread e socket... io mi ci sono scottato appena appena e dubito che ci
riproverņ :)
PS: Credo che il tuo newsreader (o newsserver) abbia qualche problema: a
volte i tuoi messaggi arrivano con subject "None" e non rispettano la
gerarchia iniziale!


più di due client il tutto si rallenta mostruosamente... 
Non capisco per quale motivo la cosa rallenti mostruosamente, io ho
sempre usato, per questo genere di cose, dei thread non blocking e ha
sempre funzionato tutto abbastanza velocemente.  Sei sicuro che non
fai qualche altro tipo di errore ? Vedere un pò di codice aiuterebbe.


Ciao Andrea,
Dunque...
Anzitutto... Mi stai dicendo che non mi va a capo a 80 chr? Ok scusa... Controllo
In merito al codice: lo so che sarebbe meglio ma è un macello mettere il codice. Ti spiego cosa fa questo servizio. (abbiamo forse trovato il modo di aggirare il problema)
Il servizio, all'avvio legge da un file di configurazione quali cartelle (relazionati ad host diversi) controllare. Istanzia perciò una lista di thread che attendono notifiche dalle cartelle da monitorare. Al contempo istanza un socket server con il quale i client devono comunicare per operazione di controllo di accesso, di progressione dell'operazione o altre richieste particolari. Quando il client si connette fornisce una chiave al sistema che aggiorna gli host monitor. Una volta avuta la conferma il client invia i dati in FTP. Al termine dell'invio FTP un host monitor si sveglia ed esegue un controllo di chiave per capire con quale client (socket) deve comunicare... Parte la procedura che deve eseguire il servizio (ovvero: backup dei dati, estrazione dei dati appena inviati, controllo ed eventuale creazione di un nuovo file). Durante questa operazione il client deve essere informato di tutte le operazioni che il server sta compiendo... In più entrambi devono fare un controllo di timeout.
Attualmente lo scambio era direttamente relazionato e le due entità attendevano sempre risposta dall'altro per concludere correttamente l'operazione di notifica via socket. Abbiamo notato che questo rallenta la cosa e stiamo riprogettando in questo modo:
- Il servizio esegue le operazioni per conto suo, ha solo una chiave con la quale si identifica col client. 
- Il client invia richieste di stato (che quindi non richiedono attesa di conferma)
Abbiamo fatto una applicazione stupida e eseguendo solo copie lato server anche 30/35 applicazioni conteporaneamente non generano problemi.
Ti ringrazio lo stesso per l'aiuto e se hai suggerimenti, sono sempre bene accetti :-)
Un saluto
In quest giorni abbiamo deciso che la cos
-----Messaggio originale-----
Da: Andrea Laforgia [mailto:
x@x.x
] 
Inserito: venerdì 21 febbraio 2003 13.14
Inserito in: delphi
Conversazione: Socket Blocked
Oggetto: Re: Socket Blocked


Anzitutto... Mi stai dicendo che non mi va a capo a 80 chr? 
Lo standard di Usenet è 72 colonne.
