Newsgroup: it.comp.programmare.win32
Titolo: Winsock [lungo]

(Scusate se riposto ma, perlomeno io, non visualizzo il post fatto in
precedenza....)
Ancora una volta winsock... realizzando un' applicazione client - server,
con server che può accettare
 diverse connessioni (stò cercando di realizzare una chat stile ICQ) incappo
nei seguenti problemi :o(
1)     se invio una stringa ad una applicazione, sia essa client o server, e
questa applicazione e'
        momentaneamente occupata a fare altro, appena finisce di fare quello
che sta facendo
        riceve un messaggio FD_READ e in tal modo, può leggere ciò che gli
era stato inviato
        in precedenza... ora: nel caso in cui io invii una seconda stringa
prima che la prima sia
        stata letta, il messaggio FD_READ è uno solo e quando eseguo la
recv() ricevo tutte e
        2 le stringhe contemporaneamente: con evidenti problemi di
gestione....
        Avevo pensato di fare una cosa del genere:
SERVER:
         iRisSend = send  ( client[destinatario].sockCli, (char *)&p,
sizeof(PROTO), 0 );
         while( ( recv( client[destinatario].sockCli, buf, 2, 0 ) < 0 ) );
CLIENT:
        numbytes = recv(sSockRcv, rcv_buff, 100, 0);
        send ( sSockRcv, "ok", 2, 0);
        in pratica dopo che faccio la send entro in un ciclo che non esce
finche non ricevo una stringa
        di 2 caratteri e, quando il "client" riceva la stringa, invia
appunto una stringa di 2 caratteri,
        facendo cosi uscire il "server" dal loop.
        Ciò implica molti altri problemi:
        -    la stringa che invio dopo la funzione recv() e completamente
esterna al protocollo da me utilizzato,
             ma ciò è sormontabile,
        -   dopo che esco dal loop e la funzione termina, ricevo egualmente
il messaggio FD_READ, creando
             cosi un effetto "ping-pong" in quanto il server avendo ricevuto
FD_READ esegue una recv() e invia
             una stringa di 2 caratteri, il client la riceve e a sua volta
ne manda un altra, e cosi via....
2)    Il Server non riesce a gestire contemporaneamente la comunicazione
verso tutti i client: utilizzando i
        threads (probabilmente sono io che li uso male) son solo riuscito a
peggiorare le cose, cercando
        esempi su internet ho trovato solo esempi x linux dove esiste la
funzione FORK() ke invece
        sotto win32 non esiste.... ho letto da qualche parte che può essere
sostituita con CreateProcess()
        ma mi sembra eccessivo creare un altra istanza del server per ogni
client connesso!!
Mi scuso se il messaggio e' lungo e sopratutto incomprensibile ;o) prima o
poi imparerò anche a comunicare =)
Grazie a chi avra' voglia di leggerlo
K

 ha scritto nel messaggio
news:U6DU9.21219$lj5.2...@tornado.fastwebnet.it...


 client connesso!!
Dovresti creare threads (CreateThread) non processi.
In realta, se usi non bene ma bensi CORRETTAMENTE i windows sockets nella
modalità asincrona non hai affatto bisogno di threads.
I threads sono solo necessari con sockets sincroni (modello select). Quando
usi windows sockets asincroni (modelli WSAAsyncSelect, WSAEventSelect,
Overlapped, Completion Port) il sentirsi ad un certo punto costretti a dover
impiegare i threads è indice SICURO del fatto di non aver capito quello che
si sta facendo (e per il fatto che parli di FD_READ ne deduco che stai
usando il modello WSAAsyncSelect o il modello WSAEventSelect).
Bob Rock

No il problema non era come si usano i thread, quello ormai dovrei averlo
imparato,
il fatto è che avevo dei problemi con delle variabili e non avevo voglia di
rivedere il
tutto :)
Cmq hai effettivamente ragione... se un client mi incasina il server anche
tutti gli altri
client si trovano ad aspettare che il primo finisca... ed è abbastanza
noioso,
cercherò sicuramente di risolvere ;o)
Tnk 1K


Cioè?? potresti spiegarmi meglio??
Utilizzo socket asincroni ma da quanto ho capito
una volta ricevuto FD_READ dal socket A,
chiamo una funzione che mi entra in un loop infinito,
il socket B mi manda una stringa....
non mi sembra che riceva ugualmente un messaggio
FD_READ e venga "processato" finche non ritorno
dalla funzione chiamata nel case FD_READ precendente...
Mi sbaglio?????
Tnk

 Mi sbaglio?????
Andiamo per gradi: quale modello di sockets asincroni stai usando? Il
modello WSAAsyncSelect o il modello WSAEventSelect?
Bob Rock

 > Mi sbaglio?????
Se lavori su windows per ogni connessione da parte di un client allo stesso
server vengono creati un certo numeri di socket virtuali tutti in ascolto e
in processi differenti...
Poi quella di gestire con thread e socket asincroni č certo la soluzione
migliore, ma per la creazione di applicazioni come un server ICQ puoi anche
definire una specie di impacchettamento dei dati, visto che ogni utente č
identificato da un codice univoco, evitando cosě alcuni fastidi legati alla
gestione di socket differenti.


WSAAsyncSelect();