Newsgroup: it.comp.lang.pascal
Titolo: Client, socket, winsock, funzioni schifide come recv() ecc ecc

Salve, e' la prima volta che scrivo su questo NG
Come linguaggi di programmazione conosco abb bene solo il Pascal, anche se
conosco un po di C.
Molto presto vorrei passare al Delphi, comunque adesso il problema e' un
altro.
Da pochi giorni mi sono posto il problema di permettere ai miei programmi
di comunicare attraverso internet.
Ora per provare, sto tentando di costruirmi un piccolo client (tipo telnet)
cercando diversi esempi su internet.
Il mio problema e' che molti dei programmi che si trovano online, danno per
scontato che il server invii dei dati solo in seguito a un comando
dell'utente quindi lavorano in questo modo:
ripeti
-spedisco comando al server
-aspetto risposta e la stampo
finche' ...
Il problema e' che io voglio che il client possa ricevere anche se non
invia comandi (IRC ad esempio) allora faccio in modo che il comando venga
spedito solo se premo dei tasti... e specificamente quando premo Invio
ricostruisce tutto cio' che ho digitato dall'ultimo inviio e lo spedisce al
server.
Fin qui sembrerebbe tutto ok, ma subentra un altro problema:
recv()
funzione che permette di ricevere dati dal socket aperto, se non sente dei
dati in entrata entra in loop (bloccandomi il programma) finche non "sente"
dei byte in ingresso. A questo punto mi chiedevo se nessuno di voi avesse
un piccolo esempio da postare, o un suggerimento per risolvere questo
problema.
Kei
ps: ho anche assegnato i dati ricevuti dal sock a un file testo, ma se vado
troppo altre a leggerlo ricevo un runtime error, devo ancora capire xke, se
sapete spiegarmelo, magari!

 problema.
Vediamo se ho capito il problema (ho un po di mal di testa e potrei dire
stroxxxx) tu hai 2 procedure
senddata
recevdata
la prima manda i dati quanto sei connesso, la seconda riceve i dati che il
server ti manda, mentre la prima la richiami quando hai dei dati pronti la
seconda la devi richiamare sempre perchè il server potrebbe mandarti dati in
qualsiasi momento, prendendo IRC come esempio il server a cui sei connesso
manda sempre dei PING ai quali devi rispondere con dei PONG altrimenti il
server ti chiude la connessione. Ora  quando non devi inviare niente devi
cmq ascoltare il server
penso che
recevdata sia strutturata in questo modo
ripeti
    recv (MySocket, Buffer, BufferLength, 0);
finche Buffer è vuoto.
Quando il server ti invia dati allora Buffer viene riempito ed esegui una
operazione come PONG. Se non ricevi niente continui ad ascoltare e quindi
rimani in loop e non puoi fare nessu altra operazione. Ora le opportunità
sono 3
1) Usi un linguaggio come Delphi o Visual Basic : dove ogni operazione può
essere vista come un evento, e quindi non hai loop, infatti il click su un
tasto invia manda in esecuzione la funzione collegata.
2) Usi un linguaggio multiprocess o multithread ad esempio il C sotto
linux/unix : crei un processo o un thread che gestisce ricezione dei dati e
li manda al programma pricipale.
3) Ti appoggi su un interrupt ciclico come il timer sostituendo la funzione
di gestione del tempo con quella che riachiama recv in questo modo potresti
leggere i dati senza un vero loop. Qui però hai dei problemi di
sincronizzazione del programma, infatti :
    potresti avere dei dati che arrivano ripetutamenete e li devi gestire
quindi mentre stai gestendo un dato
    potrebbe arrivarne un altro, da accodare, e gestire successivamente, ma
così potresti avere dei lag
    enormi.
    oppure potresti ripristinare il vecchio interrupt durante la gestione
dei dati inviati o mentre invii dei dati,
    rimandendo pendenti uno o più dato inviati, anche qui potresti avere dei
lag enormi.
Sempre se non ho detto caxxx... la scelta migliore sarebbe la 2 dato che
conosci un po di C (se usi un sistema multi thread come Windows o Linux)
Crei un programma che inizializza la connessione e crea un thread figlio che
si mette in ascolto del server poi si mette i attesa, non appena riceve un
dato crea un thread figlio che gestisce i dati e li passa al padre che
successivamente li passa al nonno che te li visualizza, in questo modo il
primo processo deve sono attendere dati dai figli o dati da inviare, avendo
2 processi separati uno per l'invio e l'altro per la ricezione rendi
indipendenti le due operazioni e devo solo gestire la comunicazione tra
processi.
Ciao ReDiCuori
--
L'informatica è un arte
---------------------------------------------------------
 
www.pascallike.too.it
 
http://utenti.lycos.it/pascallike
 il sito sulla programmazione pascal e non solo
---------------------------------------------------------

 problema.
Se non ricordo male... bisogna utilizzare il comando select che
restituisce tre liste, composte dai socket effettivamente leggibili,
scrivibili e in errore. 
A quel punto, sapendo che c'e' qualcosa da ricevere, si puo' effettuare
una recv senza problemi.
Bye

 
Ecco, beccato!
Avevo pensato spesso di passare a Delphi, a questo punto ti chiedo un altra
cosa,
passare da Pascal a Delphi e' difficile, consigli qualcosa di mezzo?
Il C e' ancora in fase di apprendimento quindi sinceramente eviterei di
imbarcarmi in qualcosa del genere, visto che cmq con i multithread nn ho
avuto esperienze finora.
Il mio obiettivo finale sarebbe di approdare a qualcosa chem i permetta di
creare apps per win32.
Delphi dovrebbe andare vero? Ma poi cosa c'e' di meglio? quale sarebbe
l'ideale punto di arrivo ?
Kei
ps: x il delphi, ce ne stanno in giro di compilatori free con una buona
dotazione di unita' (sockets, winsock, ma anche per appz win32?)
pps: io per il pascal uso FPC avete consigli x qualcuno migliore? Xke a me
l'IDE mi si incasina ogni tanto :D

> passare da Pascal a Delphi e' difficile, consigli qualcosa di mezzo?
Su questo non ti posso aiutare ho visto solo qualche codice di delphi e nn
mi sono mai applicato più di tanto, cmq Pascal e Delphi sono diametramente
opposti per modo di raggionare, mentre il pascal è un linugaggio imperativo,
il Delphi e un liguaggio orientato ad oggetti.... per la sitassi beh, li
basta solo un manuale. Il compilatore lo trovi sul sito della borland ci
deve essere una versione free, cmq per quello che riguarda il delphi
troverai risposte + esaurienti su it.comp.lang.delphi


 problema.
Devi utilizzare due thread: nel primo metti il programma, le send ecc, nel secondo metti un ciclo:
recv()
notifica ricezione al thread principale()
ripeti
cosi' i due thread lavoreranno insieme e potrai ricevere dati quando vorrai :)