Newsgroup: it.comp.lang.delphi
Titolo: Un piccolo aiuto...

Salve a tutti,
dovrei realizzare una semplice applicazione che legge un file su un pc e lo
invia su un altro tramite la rete (Internet/Intranet),
quale componente mi consigliate?
Ho provato TPowersock ma non sono riuscito a farlo funzionare!
Non so nemmeno se è quello più adatto, a chiunque mi aiuterà una copia
gratis del mio software (ok,ok non è una minaccia, solo se la volete ;) ),
sarò eternamente grato a chiunque potra darmi un suggerimento per andare
avanti!
Ciao e grazie anticipatamente.
Carlo.

gratis del mio software (ok,ok non è una minaccia, solo se la volete ;) ),
Va bene, la aspetto! :)
Ciao!
--
- Carlo -

 avanti!
per l'ambito Intranet, io ultimamente dovevo trasferire un file dal mio PC
 con Windows 98 ) ad un altro PC ( con Win3.1 ).
Ho utilizzato l'API "CopyFile" e funziona a meraviglia !!
Oppure si può fare con Winsock, ma io non mi sono voluto complicare la vita.
Ti saluto.....ciao !!
Antonio Tarolla

Oppure si può fare con Winsock, ma io non mi sono voluto complicare la vita.
Volendo usare i socket, qualcuno sa se e' possibile determinare quale
sia il numero di porta utilizzabile ?
Ho visto che per default il demo Borland usa 1024, che tra l'altro
dovrebbe rientrare tra le porte per i servizi standard Unix...
Qual'e' l'intervallo dei numeri di porta utilizzabili ? 
E' possibile determinarlo a run-time ?
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------------
"There is nothing better for understanding a kangaroo
 than seeing it jump." [D.Grune, C.J.H. Jacobs]
-----------------------------------------------------

 :)
    Io le ho viste, ma non le ho provate... Sono però orientate più ai
servizi che ad una connessione Socket (sono implementati tutti protocolli
dall'UPD al TELNET, ma niente su TCP - IP semplice... Sono meglio quelli di
Delphi).
    Grazie per la citazione, ma nache tu non scherzi quando si parla di
Socket ;-)
    Saluti!
______________________________________
Gian Luca Dalla Torre
E - Mail: 
gianluca....@casteo.net
______________________________________

 E' possibile determinarlo a run-time ?
    Le porte sono definite da un RFC (il 1060) e riserva le prime 1024, le
successive 1024 sono riservate a programmi famosi... In teoria quelle dalla
2048 in su sono libere ma non puoi saperlo a priori (se un programma occupa
una porta e il tuo cerca di occuparla succedono un po' di casini).
    Per sapere quali porte sono già occupate devi utilizzare un Port Scanner
(io ne ho fatto uno se ti interessa).


 E' possibile determinarlo a run-time ?
non lo so (forse provare ad aprirne uno e vedere se dà errore)
cmq anche se si potrebbe, come fai dopo a informare i due
applicativi che si devono parlare quale porta è stata scelta
per uno e quale per l'altro?
Ciao!
Alan Solo

 Delphi).
Io mi trovo molto meglio con quelli di Andrea Horstemeier... sono sulla DSP
credo...
Ciao :-)
--
Andrea Magni
E-Mail: 
ama...@interac.it

sia il numero di porta utilizzabile ?
Procedure TForm2.ControllaBackDoor(Prima, Ultima : Integer);
Var i : Integer;
Begin
Listbox1.items.Clear;
Progressbar1.Max:=Ultima - Prima;
Progressbar1.Position:=0;
For I:= Prima to  Ultima do begin
      Application.ProcessMessages;
      Form1.Serversocket1.active:=False;
      Form1.Serversocket1.port:=I;
      try
         Form1.Serversocket1.Active:=true;
      except
         listbox1.Items.Add(inttostr(I));
         listbox1.Refresh;
      end;
      Progressbar1.position:=Progressbar1.position+1
End;
End;
Questa la ho implementata in una mia applicazione, provala....le backdoor
che compaiono nella listbox sono occupate!
Ciao
--
- Carlo -

(io ne ho fatto uno se ti interessa).
Se e' "free" si ;)
Grazie ;)


che compaiono nella listbox sono occupate!
i valori che usi come estremi quali sono ?


per uno e quale per l'altro?
La porta non viene scelta per l'uno e per l'altro, ma e' unica per
tutti e due, altrimenti non potrebbero comunicare.
Il file Services di Windows conserva le informazioni circa i servizi
disponibili e conserva l'associazione con la porta. 
Gli applicativi fanno riferimento al servizio, non alla porta.


Oppure si può fare con Winsock, ma io non mi sono voluto complicare la
vita.
Ma te ne sai sempre una più edl diavolo! (in questo caso sono io il diavolo!
;)
Veramente non sapevo si potesse usare Copyfile....Hai fatto benissimo a non
complicarti la vita con le socket...
Ciao!
--
- Carlo -
c.b...@libero.it

Socket ;-)
;-)
Bye!
--
- Carlo -

i valori che usi come estremi quali sono ?
Dipende dal controllo che mi interessa (quelli che passo alla procedure),
cmq se non erro le backdoor "apribili" sono pari al numero di Integer....
non ne sono sicuro però...


non ne sono sicuro però...
Urgh...quindi in questo caso sarebbero 2^32 ! :(
In realta' mi sono costruito un programmino che mi fa la scansione
delle prime 65536 porte, restituendomi anche il nome del servizio
associato, pero' resta il problema di capire quale porta utilizzare
per il proprio servizio...


associato,
Cavolo, ti mostro una cosa e subito la implementi?
Ti pongo la stessa domanda che ho posto a Gian Luca, come fate ad ottenere
le informazioni supplementari sulla Backdoor aperta?
Ciao!
--
- Carlo -
c.b...@libero.it

le informazioni supplementari sulla Backdoor aperta?
Io ho usato getservbyport() (Winsock 2.0) per ottenere il nome del
servizio associato.
var FermiTutti : boolean ;
function InvertNetworkByteOrder( I : integer ) : integer ;
begin
  Result := 0 ;
  while ( I > 0 ) do
  begin
    Result := Result shl 1 + I and 1 ;
    I := I shr 1 ;
  end ;
end ;
function IntToStrEx( I, N : integer  ) : string ;
var J : integer ;
begin
  Result := IntToStr( I ) ;
  for J := 1 to N - Length( Result ) do
    Result := ' ' + Result ;
end ;
procedure TForm1.Button1Click(Sender: TObject);
var I : integer ;
    se : PServEnt ;
begin
  Label1.Caption := 'Scansione porte in corso...' ;
  ProgressBar1.Max := 65536 ;
  ListBox1.Items.Clear ;
  I := 0 ;
  while ( I < 65536 ) and ( not FermiTutti ) do
  begin
    ProgressBar1.Position := I ;
    ServerSocket1.Active := False ;
    ServerSocket1.Port := I ;
    try
      ServerSocket1.Active := True ;
      se := getservbyport( I, nil ) ;
      ListBox1.Items.Add( 
      IntToStrEx( InvertNetworkByteOrder( I ), 5 ) +
                  ' : ' + se^.s_name ) ;
      ServerSocket1.Active := False ;
    except
    end ;
    Application.ProcessMessages ;
    Inc( I ) ;
  end ;
  Label1.Caption := 'Scansione porte completata.' ;
end ;
procedure TForm1.FormShow(Sender: TObject);
begin
  FermiTutti := false ;
end ;
procedure TForm1.Button2Click(Sender: TObject);
begin
  FermiTutti := True ;
end;


complicarti la vita con le socket...
Si riesce ad usarla perche' i percorsi di rete sono accessibili, a
tutti gli effetti (escludendo problemi di autenticazione), come
percorsi locali (quindi basterebbe scrivere, per esempio
'\\mioserver\miacartella\miofile' come destinazione.



gia. bosogna condividere le cartelle!



The Well Known Ports are those from 0 through 1023.
The Registered Ports are those from 1024 through 49151
The Dynamic and/or Private Ports are those from 49152 through 65535
[RFC768][RFC793]

 Ciao!
Grazie a tutti, ho provato i componenti da te suggeriti, ma ho un piccolo
problema....
Immaginiamo di dover gestire un server e n client con la possibilità di
scambio di file fra server-client oppure
diretta client-client, voi come fareste?
1)
                                               (Server)[CS0]
                                                 /                  \
                                               /                      \
                            (Client0) [CC0]           (Client1)[CC1]
Ovvero CC=TClientSocket, CS=TServerSockect, CC0 invia lo stream verso CS0
che lo ridirigge verso CC1?
                                               (Server)[CS0]
                                                 /                  \
                                               /                      \
                        (Client0) [CC0][CS1]----- (Client1)[CC1][CS2]
Ogni client è anche un server ed effettua una connesione diretta con gli
altri?
Help!
Non so quale sia la soluzione migliore, tra l'altro ho provato ad inviare un
file Client verso Server, ma ne arriva solo una parte
dove puo essere il problema? Grazie ancora per i suggerimenti, mi sono
segnato i nomi!!! Poveri voi!! ;)
Ciao.
Carlo

 complicarti la vita con le socket...
è si, la "CopyFile" è semplicissima da utilizzare in questi casi. Bisogna
solo condividere le cartelle. Ora non ho provato a non condividerle ma usare
ugualmente la "CopyFile".
Cioè se non le condivido la "CopyFile" me la posso pure sognare, ma era nato
comunque un problema con le cartelle condivise.
In pratica la "CopyFile" non riconosceva la directory remota. Eppure erano
condivise. Poi avevo notato che se prima di utilizzare la "CopyFile" da
Delphi utilizzavo "Risorse di Rete di Windows", allora la "CopyFile"
funzionava. Mah....
Inizialmente il problema si era manifestato con il componente TTable ed un
database remoto. Così avevo chiesto nell'area database e grazie a Carlo
Bosich ho risolto tramite la "WNetAddConnection".
Ora non so se la sola "WNetAddConnection" mi possa far ottenere la stessa
funzionalità di una cartella considiva. Quando avrò tempo provo.....tanto ci
vuole un attimo !!
Ti saluto....ci si sente !!
Antonio Tarolla

 segnato i nomi!!! Poveri voi!! ;)
    Se ci dici con esattezza con che cosa hai realizzato i client e i server
(Componenti standard di Delphi, WinShoes o cos'altro) e ci posti il codice
di entrambi i lati, magari possiamo aiutarti!


The Dynamic and/or Private Ports are those from 49152 through 65535
Grazie ! questo significa che posso usare le porte da 49152 in poi ?
--
Andrea Laforgia
"Nessun linguaggio di programmazione e' perfetto"
                              - Bjarne Stroustrup

altri?
Io credo che la soluzione migliore dipenda da quello che ti serve
fare.
Ad esempio, si puo' costruire un sistema di smistamento che gestisce
tutti i passaggi di dati tra un'applicazione all'altra e ne conserva
ogni informazione in una tabella.
In questo caso e' utile il passaggio tramite un server, il quale
provvedera' a salvare i dati in una zona protetta e a loggare
l'avvenuta ricezione.
Il Client0 che vuole trasferire un file al Client1, inviera' una
richiesta al server, informandolo di quale sia il destinatario delle
informazioni e passando le informazioni stesse.
Il server informera' il Client1 che ci sono delle informazioni per
lui.
Il Client1 ricevera' le informazioni dal server.
A questo punto, per esempio, sul server ci sara' un log del tipo :
ORA      AZ  MITT     DEST    DATI
-----------------------------------------------------
12:24:00 TD  Client0  Client1 D:\MIOFILE.TXT
12:24:01 RD  Client0  Client1 D:\MIOFILE.TXT
cioe' il Client0 ha trasmesso i dati alle 12:24:00 e il destinatario
li ha recuperati alle 12:24:01.
Si possono costruire dei sistemi molto sofisticati su questa base e
puo' darsi che non ti serva una cosa cosi' complessa, pero' in
generale una base dati centrale e' utile per fare delle elaborazioni
statistiche sul traffico di informazioni tra le applicazioni.
Forse questo modello, pero', ha lo svantaggio di essere applicabile
quando la dimensione delle informazioni passate e' contenuto.
Un traffico continuo di grandi file sulla rete potrebbe rendere il
tutto ingestibile (per ogni trasferimento ve ne sarebbero due in
realta' client mitt-->server e server-->client dest).
L'alternativa, chiaramente, e' quella di consentire alle applicazioni
client di essere client e server nello stesso tempo e scambiarsi file
in modo indipendente da un punto centrale.



Il programma che hai descritto e' molto simile a Napster...in effetti
secondo me fornire il client di un TServerSocket e' la soluzione migliore,
perche' in caso di trasferimenti simultanei il server principale si
intaserebbe e non poco...se poi il trasferimento avviene via internet invece
che su LAN, non ne parliamo...
Quando ho avuto la necessita' di spedire files (tempo fa), usando la
socket.sendstream non ho avuto problemi...appena ho un po' di tempo cerco la
procedura e se non hai risolto il problema te la mando...
PS: Per il fatto delle porte libere, in genere e' opportuno fornire il
proprio programma (server) di una opzione per settare la porta prendendo il
valore da un lista di possibili numeri, generalmente consecutivi; ad esempio
6666;6667;6668;6669 ... mi raccomando non usare questi! ;) Sono tipici di
IRC... BYE.

                               - Bjarne Stroustrup
Scusa, ma sembra quasi che tu dica che non e' possibile creare un log, se si
sceglie di effettuare una connessione client-->client ... se e' cosi' temo
che ti sbagli...anche se il trasferimento avviene fra i client, nulla
impedisce loro di notificare semplicemente l'avvenuto trasferimento al
server centrale ... l'unica situazione in cui sembra servire la connessione
client-->server-->client secondo me e' quando il client di destinazione non
e' collegato ed il server provvedera' alla trasmissione del file (o dei
dati), la prima volta che il suddetto client si colleghera'.
Io adoro tenere dei log, non solo per le statistiche, ma anche perche' non
sempre e' possibile usare il debug su un programma; ho fatto un programma
che e' molto simile a quello descritto da Carlo Vona, ho adottato la
soluzione appena proposta e per i log non c'e' alcun problema... BYE BYE!
PS: Di problemi ce ne sono comunque da tutte le altre parti!! ;P

PS: Di problemi ce ne sono comunque da tutte le altre parti!! ;P
Non capisco cosa vuoi dire.

 --
praticamente hai meno possibilita' di conflittare, anche se,
stando tra la 1024 e la 49000 e' difficile avere problemi.
ICQ ad esempio usa la 4000, che sarebbe gia registrata,
ma se ne frega, e funziona.
ce ne sono un sacco non assegnare 1249-1299; 1301-1309...
bye

 Non capisco cosa vuoi dire.
Intendevo dire nel mio programma! :)

sinceramente non mi sembra poco...
Hai il vizio di fraintendere : nessuno ha detto che la possibilita' di
riscontrare errori in un log sia da sottovalutare ! 
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
"I know every element of C" - Ioannis Vranos





Prima di tutto vorrei scusarmi per l'intermittenza della mia presenza, ma
ultimamente la mia lan ha avuto qualche problema....
In effetti il risultato che vorrei ottenere è simile a napster, ma nella
realizzazione ho incontrato alcune difficoltà, per esempio
anche io pensavo che la connesione diretta client to client fosse la
migliore ma c'è un piccolo problemino, non
ho ancora capito qual'è l'indirizzo coretto da utilizzare, mi spiego:
Il computer C0 sulla LAN ha l'indirizzo "196.142.1.1" ma su internet gliene
viene assegnato un'altro "212.200.100.100"
quale dovrei usare? l'host cambia totalmente con il nome del server del
provider, insomma c'è un po di confusione...
se il client c0 non riesce indirizzare corettamente il client c1 non
riuscirò mai a realizzare una connessione fra i due....
PS: ho già realizzato buona parte dell'architettura client server
multithread e con scambio automatico di messaggi fra i server
mi potete comunicare la vostra email al mio indirizzo privato 
c.v...@xite.it
per l'invio dei source?
Grazie mille per il vostro aiuto!
Carlo


Premetto che non so se ho capito perfettamente il problema...ma ti do una
dritta...tutti i client (C1,C2,Ecc..) si collegano al server, quindi questo
e' in grado di fornirti tramite le socket (SServer.Socket.Connections[I] per
I da 0 a SServer.Socket.ActiveConnections) tutti gli indirizzi di tutti i
client collegati, tramite le proprieta' localhost o localaddress...