From: io_x on

"io_x" <a(a)b.c.invalid> ha scritto nel messaggio
news:4c26fac9$0$18994$4fafbaef(a)reader5.news.tin.it...
> what about this?
>
> ; int FunzioneDelServer(i8** argm)
> ;
> ; Essa:
> ; 0) scrive nella finestra MD_ED_SERVER una "A" [server attivato]
> ; 1) crea un thread per stampa input dal socket alla finestra;
> ; tale subtrhead
> ; bloccaLaRisorsaSys(UsoSocket)
> ; estrae fd del soket che usa dopo
> ; liberalarisorsaSys(UsoSocket)
> ; usa fd con select per vedere se vi e' un evento read
> ; .a: se l'evento e' read
> ; bloccaLaRisorsaSys(UsoSocket)
> ; legge il socket
> ; liberalarisorsaSys(UsoSocket)
> ; invia tutto alla finestra
> ; altrimenti controlla che l'evento "eventoUscitaSottoThread"
> ; nel qual caso
> ; resetta eventoUscitaSottoThread
> ; esce
> ; goto .a
> ; 2) aspetta indefinitivamente per i messaggi:
> ; eventoUscitaFun [il secondo dell'array di eventi 4]
> ; bloccaLaRisorsaSys(UsoSocket)
> ; chiude il socket
> ; liberalarisorsaSys(UsoSocket)
> ; cosi' la select del sottotread deve ritornare
> ; setta l'evento "eventoUscitaSottoThread"
> ; resetta l'evento "eventoUscitaFun"
> ; eventoInviaDati [il terzo dell'array di eventi 12]
> ; legge la finestra di invio dati
> ; bloccaLaRisorsaSys(UsoSocket)
> ; scrive la finestra invio dati nel socket
> ; liberalarisorsaSys(UsoSocket)
> ; resetta l'evento "eventoInviaDati"
> ; eventoUscitaSottoThread [ho capito che si puo' fare 16]
> ; nel qual caso esce dal loop
> ; LiberaMemoriaRisorsaSys(UsoSocket)
> ; libera le risorse del subthread
> ; scrive nella finestra MD_ED_SERVER una "" [stringa vuota]
> ; esce dalla funzione
>
> if there is one subthread that close one socket
> then if one other thread has one select() that wait to +oo for
> read only for that same soket
> than if the socket is close, the select function return?
>
> WaitForMultipleObjects() function
> is good to for thread exit [pass the handle]?

what about this? seems ok for the Pc "localhost"
it will be ok for the net?
the only thing not much clear is how to find the address
of this pc connect to the net
here result localhost [from some os function don't remember]= 127.0.0.1
but i know when i connect to
the net i have one address; How find that address?
[ for this connet it should be 213.45.245.191]

; int FunzioneDelServer(i8** argm)
;
; Essa:
; 0) scrive nella finestra MD_ED_SERVER una "A" [server attivato]
; 1) crea un thread per stampa input dal socket alla finestra;
; tale subtrhead
; bloccaLaRisorsa(UsoSocket)
; estrae fd del soket che usa dopo
; liberalarisorsa(UsoSocket)
; .a: usa fd con select per vedere se vi e' un evento read
; se l'evento e' read
; bloccaLaRisorsa(UsoSocket)
; legge il socket
; liberalarisorsa(UsoSocket)
; invia tutto alla finestra
; altrimenti controlla che l'evento "eventoUscitaSottoThread"
; nel qual caso
; resetta eventoUscitaSottoThread
; esce
; nel caso di qualche errore setta "eventoUscitaFun"
; goto .a
; 2) aspetta indefinitivamente per i messaggi:
; eventoUscitaFun [il seconto dell'array di eventi 4]
; bloccaLaRisorsa(UsoSocket)
; chiude il socket
; liberalarisorsa(UsoSocket)
; cosi' la select del sottotread deve ritornare
; setta l'evento "eventoUscitaSottoThread"
; resetta l'evento "eventoUscitaFun"
; goto 2
; eventoInviaDati [il terzo dell'array di eventi 12]
; legge la finestra di invio dati
; bloccaLaRisorsa(UsoSocket)
; scrive la finestra invio dati nel socket
; liberalarisorsa(UsoSocket)
; resetta l'evento "eventoInviaDati"
; se qualche errore setta "eventoUscitaFun"
; goto 2
; eventoUscitaSottoThread [ho capito che si puo' fare 16]
; nel qual caso esce dal loop
; LiberaMemoriaRisorsaSys(UsoSocket)
; libera le risorse del subthread
; scrive nella finestra MD_ED_SERVER una "" [stringa vuota]
; esce dalla funzione
; 32..36 thandle
; 40..44 led
; 100..200 argomenti del sottotread
; 200..1224
; 0k,4j,8i,12b,16Ra, 20P_Argm +2048
; 2068
align 4
FunzioneDelServer:
<b,i,j,k
<< thandle=32, argf=100, fsock=0, eventi=4, ifinestra=8
s-=2048
^40=0
;iint3
j=^2068|i=*j+ifinestra ; *j=socket, *j+4=eventi, *j+8=ifinestra
PostMessage(i, &WM_COMMAND, 1028, 1) ; scrive la F
; D*s="F"|a=s|SetDlgItemTextA(i, MD_ED_SERVER, a) ; F == funzione del
server
D*j==0#.z|D*j+4==0#.z
r=argFunzioneDiFunzione ; indirizzo degli argomenti di funzione di
funzione
a=*j+fsock |*r+fsock =a ; socket
|*r+4=i ; la i della finestra in ^4
a=s|CreateThread(0, 0, FunzioneDiFunzione, r, 0, a)|a==0#.z|^thandle=a
*eventoUscitaSottoThread=a ; inizializza l'elemento 4 dell'array di eventi
; riempie le caselle dei dati della connessione
a=s |D*a=0|SetDlgItemTextA(i, MD_ED_RICEVI, a) ; azzera la finestra
ricevi
a=&^200|r=*j+fsock|EstraiDataDalSocket(a, 200, r)|a<=0?#.z
a=&^200|SetDlgItemTextA(i, MD_ED_DATA_CONN , a) ; scrive la data
;40..60:0..2Wyear, 2..4wmonth, 4..6whour, 6..8wminiut, 8..10wsec, 10..12day
; 12..14=1024, 14..16=sin_port, 16..20sin_addr
r=*j|r+=40|a=*r+16
r=&^200|inet_ntoa_m(r, 200, a)|a<=0?#.z
r=&^200|SetDlgItemTextA(i, MD_ED_IP, r) ; scrive l'indirizzo ip del
ricevente
a=*j+fsock|r=&^200
; EstraiUnNomeNonPuntatoDalSocket(r, 200, a)|a<=0?#.z
; a=&^200|SetDlgItemTextA(i, MD_ED_COL , a) ; scrive il nome

;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] [ 0] 1
eventoInviaDati dd 0 [ 8] [ 4] 2
eventoUscitaSottoThread dd 0 [12] [ 8] 3
eventoComunicaEsciStread dd 0 [16] [12] 4
;;
..1: a=*j+eventi ; inizia dall'evento eventoUscitaThread
WaitForMultipleObjects(4, a, 0, &INFINITE)
a==0!#.1a
^40==1#.3c
#.1b
; |a==&WAIT_FAILED#.z l'errore di fallimento di select e' l'ultimo della
lista
..1a: a==1!#.2 ; evento 1 di uscita della funzione
..1b: ^40=1 ; significa che possiamo uscire all'uscita del sottotread
a=*j+eventi|r=*a+12|SetEvent(r) ; setta eventoComunicaEsciStread
a=*j+eventi|r=*a+0 |ResetEvent(r) ; resetta eventoUscitaFun
BloccaRisorsaSys(UsoSocket)
a=*j+fsock|FcloseSocket_m(a) ; chiude il socket aperto dal server
LiberaRisorsaSys(UsoSocket)
jnc .1
PostMessage(i, &WM_COMMAND, 1036, "Errore: Chiusura socket") ;
scrive errore
; SetDlgItemTextA(i, MD_ED_MSGERR, "Errore: Chiusura socket")
##.1
..2: a==2!#.3 ; evento 2 invio dati dalla finestra a socket
;iint3
a=&^200|GetDlgItemTextA(i, MD_ED_MANDA, a, 1024)
^0=a ; in *s li numero dei caratteri da spedire
^4=0 ; in *s+4 il numero degli errori
BloccaRisorsaSys(UsoSocket)
a=*j|a+=20 ; "a" punta al FILE per scrivere
c=^0|r=&^200|Fwrite_m (r, 1, c, a)|^4++=0
a=*j|a+=20 |Fflush_m(a)|^4++=0
LiberaRisorsaSys(UsoSocket)
^4==0#.2b
PostMessage(i, &WM_COMMAND, 1036, "Errore: Spedizione non riuscita")
; errore
; SetDlgItemTextA(i, MD_ED_MSGERR, "Errore: Spedizione non riuscita")
a=*j+eventi|r=*a+0|SetEvent(r) ; se errore setta eventoUscitaFun
..2b: a=*j+eventi |r=*a+4|ResetEvent(r) ; resetta eventoInviaDati
##.1
..3: a==3#.3a ; non puo' teoricamente essere possibile un evento diverso da 3
; quindi in caso di evento diverso da 3 esce
PostMessage(i, &WM_COMMAND, 1036, "Errore: Evento non previsto") ;
errore
;SetDlgItemTextA(i, MD_ED_MSGERR, "Errore: Evento non previsto")
; evento 3 eventoUscitaSottoThread
..3a: ^40==0!#.3c ; il sottoread
BloccaRisorsaSys(UsoSocket)
a=*j+fsock|FcloseSocket_m(a) ; chiude il socket aperto dal
server
LiberaRisorsaSys(UsoSocket)
jnc .3c
PostMessage(i, &WM_COMMAND, 1036, "Errore: Chiusura socket") ;
errore
;SetDlgItemTextA(i, MD_ED_MSGERR, "Errore: Chiusura socket")
..3c: ;D*s=0|a=s|SetDlgItemTextA(i, MD_ED_SERVER, a)
;D*s=0|a=s|SetDlgItemTextA(i, MD_ED_DATA_CONN, a)
PostMessage(i, &WM_COMMAND, 1030, 1) ; cancella la F
PostMessage(i, &WM_COMMAND, 1031, 1) ; cancella la data di connessione
a=^thandle|CloseHandle(a)
..z: ; all'uscita resetta la casella di collegamento
; resetta tutti gli eventi utilizzati in questa funzione e nel sottothread
a=*j+eventi|r=*a+0 |ResetEvent(r) ; resetta eventoUscitaFun
a=*j+eventi|r=*a+4 |ResetEvent(r) ; resetta eventoInvioDati
a=*j+eventi|r=*a+12|ResetEvent(r) ; resetta eventoComunicaEsciStread
D*eventoUscitaSottoThread=0 ; resetta il nome del thread
s =&*s+2048
>> thandle, argf, fsock, eventi, ifinestra
>b,i,j,k
ret 4

; int FunzioneDiFunzione(i8** argm)
; argm[0]==fsock, argm[1]=ifinestra
; tale subtrhead
; bloccaLaRisorsa(UsoSocket)
; estrae fd del soket che usa dopo
; liberalarisorsa(UsoSocket)
; .a: usa fd con select per vedere se vi e' un evento read
; se l'evento e' read
; bloccaLaRisorsa(UsoSocket)
; legge il socket
; liberalarisorsa(UsoSocket)
; invia tutto alla finestra
; altrimenti e' levento fine connessione: esci
; goto .a
;0k,4j,8i,12b,16Ra, 20P_Argm + 2048
; 2068
; a=^2068 => *a==socket [FILE_m*], *a+4== ifinestra
align 4
FunzioneDiFunzione:
<b,i,j,k
<< sck=0, ifinestra=4
s-=2048
D*bss_Index=0 ; inizializza il bss_Index per tale connessione
D*bss_buffer=0 ; mette qualche zero all'inizio del buffer di ricezione
j=^2068
..0: BloccaRisorsaSys(UsoSocket)
a=*j+sck|k=*a+16 ; prede fd del socket
LiberaRisorsaSys(UsoSocket)
i=*j+ifinestra
..1: ^20=1|^24=k ; select aspetta indefinitivamente
c=&*s+20|select(0,c,0,0,0)
..3: a== -1#.f ; se errore esci dalla funzione dovuto alla chiusura del socket
..4: ; iint3
BloccaRisorsaSys(UsoSocket)
r=*j ; "r" punta al FILE per leggere
k==*r+16#.4a|LiberaRisorsaSys(UsoSocket)|#.f ; la connessione e' finita
..4a: ; a=&^32|FreadInviato_m(a, 1, 2000, r)
;iint3
a=*bss_bufPointer|c=*bss_bufPointerEnd|FreadCircular(a, c, bss_Index, r)
LiberaRisorsaSys(UsoSocket)
jc .e ; CF==1 significa errore
c#.f ; se trova EOF
#.5 ; tutto ok
..e: PostMessage(i, &WM_COMMAND, 1036, "Errore: di Fread chiudo la
connessione")
;SetDlgItemTextA(i, MD_ED_MSGERR, "Errore: di Fread chiudo la
connessione")
PostMessage(i, &WM_COMMAND, MD_BTN_CLOSE, 1)
#.f
..5: ; r=&^32|B*r+a=0
r=*bss_bufPointer|SetDlgItemTextA(i, MD_ED_RICEVI, r)
##.1
..f: a^=a
..z:
s=&*s+2048
>> sck, ifinestra
>b,i,j,k
ret 4

align 4
tcpServerUno_m:
<b,c,r,i,j,k
s-=256
<< nPort=0, nomeF=4, argf=8, eventU=12, sockfp=4, server=16
<< client=40, hThread=64, lpThreadId=72, fd=16
<< Nerrori=128
; iint3
k=1|j=*s+284 |j==0#.2
D*j+nPort<=0?#.2|D*j+nomeF ==0#.2
D*j+argf ==0 #.2|D*j+eventU==0#.2|^Nerrori=0|#.4
; trattamento degli errori
..1: closesocket(i)
..2: a=k
..e: stc|##.f
..4: k=3 ; D[_socketSta]#.4a
OpenSocket_m()|jc .2
..4a: k=4|socket( &AF_INET, &SOCK_STREAM, 0)|a== -1#.2|i=a
a=*j+nPort|a>=0FFFFh#.1|htons(a) |b=&^server
[b + sin_port ]= ax
htonl( &INADDR_ANY)| [b + sin_addr]=a
W[b + sin_family]= &AF_INET ; b=server struct,
j=socket
D[b + sin_zero ]= 0| D[b+sin_zero+4]=0 ; i=fd
k=5|bind(i, b,16)|a#.1
a=*j+eventU|b=*j+8|*b+4=a
k=6|listen(i, 1) |a#.1
..c0: a=&^client |^lpThreadId=16|r=&^lpThreadId
k=7|^sockfp=Faccept_m(i, a, r, 0, 5 ) ; 5s timeout
; 0 timeout client
a==0#.5 ; se nessuna connessione solo timeout vai a vedere
l'evento
a=^sockfp |r=*j+nomeF|k=8|*b=a ; ricordare che D*b+4 punta
all'evento fine
r(b)|a!=0!#.5|++^Nerrori
..5: a=*j+eventU
WaitForMultipleObjects(1, a, 0, 0)|a==&WAIT_FAILED#.1
a==&WAIT_OBJECT_0#.7 ; se l'evento termine vai alla fine
..6: #.c0
..7: k=10|closesocket(i)|a#.2
a^=a
..f:
>> nPort, nomeF, argf, eventU, sockfp, server
>> client, hThread, lpThreadId, fd
>> Nerrori
s=&*s+256
>b,c,r,i,j,k
ret 4



From: io_x on

"io_x" <a(a)b.c.invalid> ha scritto nel messaggio
news:4c3621fb$0$40291$4fafbaef(a)reader2.news.tin.it...
>
> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio
> news:4c26fac9$0$18994$4fafbaef(a)reader5.news.tin.it...
>> what about this?
>>
>> ; int FunzioneDelServer(i8** argm)

programming with event functions is not so difficult
because it is the first time, never see nothing like that,
but all ok


From: io_x on

"io_x" <a(a)b.c.invalid> ha scritto nel messaggio
news:4c375df7$0$18989$4fafbaef(a)reader5.news.tin.it...
>
> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio
> news:4c3621fb$0$40291$4fafbaef(a)reader2.news.tin.it...
>>
>> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio
>> news:4c26fac9$0$18994$4fafbaef(a)reader5.news.tin.it...
>>> what about this?
>>>
>>> ; int FunzioneDelServer(i8** argm)
>
> programming with event functions is not so difficult
> because it is the first time, never see nothing like that,
> but all ok

i send something wrong, the last time, the logic is a mistery to me
all going well all i write [with some time for debug]:
do you believe in that, even if you not
have the .exe and the .dlls?

; int FunzioneDiFunzione(i8** argm)
; argm[0]==fsock, argm[1]=ifinestra
; tale subtrhead
; bloccaLaRisorsa(UsoSocket)
; estrae fd del soket che usa dopo
; liberalarisorsa(UsoSocket)
; .a: usa fd con select per vedere se vi e' un evento read
; se l'evento e' read
; bloccaLaRisorsa(UsoSocket)
; legge il socket
; liberalarisorsa(UsoSocket)
; invia tutto alla finestra
; altrimenti e' levento fine connessione: esci
; goto .a
;0k,4j,8i,12b,16Ra, 20P_Argm + 2048
; 2068
; a=^2068 => *a==socket [FILE_m*], *a+4== ifinestra
align 4
FunzioneDiFunzione:
<b,i,j,k
<< sck=0, ifinestra=4
s-=2048
D*bss_Index=0 ; inizializza il bss_Index per tale connessione
D*bss_buffer=0 ; mette qualche zero all'inizio del buffer di ricezione
j=^2068
..0: BloccaRisorsaSys(UsoSocket)
a=*j+sck|k=*a+16 ; prede fd del socket
LiberaRisorsaSys(UsoSocket)
i=*j+ifinestra
..1: ^20=1|^24=k ; select aspetta indefinitivamente per la lettura - errore -
EOF
c=&*s+20|select(0,c,0,0,0)
..3: a== -1#.f ; se errore select esci
..4: ; iint3
BloccaRisorsaSys(UsoSocket)
r=*j ; "r" punta al FILE per leggere
k==*r+16#.4a|LiberaRisorsaSys(UsoSocket)|#.f ; la connessione e' finita
; potrebbe esser finita per l'evento "eventoUscitaFun"
..4a: ;iint3
a=*bss_bufPointer|c=*bss_bufPointerEnd|FreadCircular(a, c, bss_Index, r)
; scrive quello che il socket invia in un buffer circolare
; che ha sempre la stessa origine e sempre la stessa fine
; tale che
; cambia solo quello che "bss_Index" punta [l'indice in tale array]
; *bss_bufPointerEnd-*bss_bufPointer==2^n
LiberaRisorsaSys(UsoSocket)
jc .e ; CF==1 significa errore per FreadCircular()
c#.f ; se trova EOF
#.5 ; tutto ok
..e: PostMessage(i, &WM_COMMAND, 1036, "Errore: di Fread chiudo la
connessione")
PostMessage(i, &WM_COMMAND, MD_BTN_CLOSE, 1)
; il di sopra "Message" manda il segnale uscita funzione di funzione
#.f
..5: r=*bss_bufPointer|SetDlgItemTextA(i, MD_ED_RICEVI, r)
##.1
..f: a^=a
..z:
s=&*s+2048
>> sck, ifinestra
>b,i,j,k
ret 4


; int FunzioneDelServer(i8** argm)
;
; Essa:
; 0) scrive nella finestra MD_ED_SERVER una "F" [funzione server attivata]
; 1) crea un thread per stampa input dal socket alla finestra;
; tale subtrhead
; bloccaLaRisorsa(UsoSocket)
; estrae fd del soket che usa dopo
; liberalarisorsa(UsoSocket)
; .a: usa fd con select per vedere se vi e' un evento read
; se l'evento e' read
; bloccaLaRisorsa(UsoSocket)
; legge il socket
; liberalarisorsa(UsoSocket)
; invia tutto alla finestra
; altrimenti e' levento fine connessione: esci
; goto .a
; 2) aspetta indefinitivamente per i messaggi:
; eventoUscitaThread [il primo evento 0]
; comunica l'evento "eventouscitafun" se tale evento non e' uscito
; altrimenti aspetta il sottotread e' finito
; eventoUscitaFun [il seconto dell'array di eventi 4]
; bloccaLaRisorsa(UsoSocket)
; chiude il socket
; liberalarisorsa(UsoSocket)
; cosi' la select del sottotread deve ritornare
; setta l'evento "eventoUscitaSottoThread"
; resetta l'evento "eventoUscitaFun"
; goto 2
; eventoInviaDati [il terzo dell'array di eventi 8]
; legge la finestra di invio dati
; bloccaLaRisorsa(UsoSocket)
; scrive la finestra invio dati nel socket
; liberalarisorsa(UsoSocket)
; resetta l'evento "eventoInviaDati"
; se qualche errore setta "eventoUscitaFun"
; goto 2
; eventoUscitaSottoThread [ho capito che si puo' fare 12]
; nel qual caso esce dal loop
; LiberaMemoriaRisorsaSys(UsoSocket)
; libera le risorse del subthread
; scrive nella finestra MD_ED_SERVER una "" [stringa vuota]
; esce dalla funzione
; 32..36 thandle
; 40..44 led comunicato uscita sottothread
; 44..48 led comunicato uscita thread principale [senza resettarlo]
; 200..1224
; 0k,4j,8i,12b,16Ra, 20P_Argm +2048
; 2068
align 4
FunzioneDelServer:
<b,i,j,k
<< thandle=32, argf=100, fsock=0, eventi=4, ifinestra=8
s-=2048
^40=0 ; led comunicato uscita sottothread
^44=0 ; led comunicato uscita thread
;iint3
j=^2068|i=*j+ifinestra ; *j=socket, *j+4=eventi, *j+8=ifinestra
PostMessage(i, &WM_COMMAND, 1028, 1) ; scrive la F == funzione del server
D*j==0#.z|D*j+4==0#.z
r=argFunzioneDiFunzione ; indirizzo degli argomenti di funzione di
funzione
a=*j+fsock |*r+fsock =a ; socket
|*r+4=i ; la i della finestra in ^4
a=s|CreateThread(0, 0, FunzioneDiFunzione, r, 0, a)|a==0#.z|^thandle=a
*eventoUscitaSottoThread=a ; inizializza l'elemento 4 dell'array di eventi
; riempie le caselle dei dati della connessione
a=s |D*a=0|SetDlgItemTextA(i, MD_ED_RICEVI, a) ; azzera la finestra
ricevi
a=&^200|r=*j+fsock|EstraiDataDalSocket(a, 200, r)|a<=0?#.z
a=&^200|SetDlgItemTextA(i, MD_ED_DATA_CONN , a) ; scrive la data
r=*j|r+=40|a=*r+16 ; a punta a sin_addr
r=&^200|inet_ntoa_m(r, 200, a)|a<=0?#.z
r=&^200|SetDlgItemTextA(i, MD_ED_IP, r) ; scrive l'indirizzo ip del
ricevente
; a=*j+fsock|r=&^200 ; non funziona debug
; EstraiUnNomeNonPuntatoDalSocket(r, 200, a)|a<=0?#.z
; a=&^200|SetDlgItemTextA(i, MD_ED_COL , a) ; scrive il nome
;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] 1
eventoInviaDati dd 0 [ 8] 2
eventoUscitaSottoThread dd 0 [12] 3
;;
..1: a=*j+eventi ; inizia dall'evento eventoUscitaThread
WaitForMultipleObjects(4, a, 0, &INFINITE)|a== &WAIT_FAILED#.3c
; se fallisce wait: end non c'e' niente da fare con tutto il
resto
a==0!#.1a ; evento "eventoUscitaThread"
^40==1!#.10 ; se gia' "eventoUscitaFunzione" e' uscito
a=*j+eventi ; inizia dall'evento eventoUscitaThread
a+=12 ; punta a eventoUscitaSottoThread
WaitForMultipleObjects(1, a, 0, &INFINITE) ; aspetta il sottotread
e' finito
##.3c ;se esce da tale wait vai alla fine
;essendo tole processo in un subtread della finestra
cio'
;non dovrebbe influire sulla velocita del thread
principale
;che disegna la finestra

..10: ^44=1|#.1b ;comunica evento uscita funzione, e aspetta
..11: a=*j+eventi
a+=4 ; inizia dall'evento eventoUscitaFun
WaitForMultipleObjects(3, a, 0, &INFINITE)|a== &WAIT_FAILED#.3c ; se
fallisce end
; evento = 0,1,2
a+=1 ; aggiusta l'evento
; evento = 1,2,3
; aspetta l'evento eventoUscitaSottoThread
..1a: a==1!#.2 ; evento 1 di uscita della funzione
..1b: ^40=1 ; significa che possiamo uscire all'uscita del sottotread
a=*j+eventi|r=*a+0 |ResetEvent(r) ; resetta eventoUscitaFun
BloccaRisorsaSys(UsoSocket)
a=*j+fsock|FcloseSocket_m(a) ; chiude il socket aperto dal server
LiberaRisorsaSys(UsoSocket)
jnc .1c
PostMessage(i, &WM_COMMAND, 1036, "Errore: Chiusura socket") ;
scrive errore
..1c: ^44#.11 ; se il thread deve finire vai all .11
##.1
;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] 1
eventoInviaDati dd 0 [ 8] 2
eventoUscitaSottoThread dd 0 [12] 3
;;
..2: a==2!#.3 ; evento 2 invio dati dalla finestra a socket
;iint3
a=&^200|GetDlgItemTextA(i, MD_ED_MANDA, a, 1024)
^0=a ; in *s li numero dei caratteri da spedire
^4=0 ; in *s+4 il numero degli errori
BloccaRisorsaSys(UsoSocket)
a=*j|a+=20 ; "a" punta al FILE per scrivere
c=^0|r=&^200|Fwrite_m (r, 1, c, a)|^4++=0
a=*j|a+=20 |Fflush_m(a)|^4++=0
LiberaRisorsaSys(UsoSocket)
^4==0#.2b
PostMessage(i, &WM_COMMAND, 1036, "Errore: Spedizione non riuscita")
; errore
a=*j+eventi|r=*a+0|SetEvent(r) ; se errore setta eventoUscitaFun
..2b: a=*j+eventi |r=*a+4|ResetEvent(r) ; resetta eventoInviaDati
^44#.11
##.1
;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] 1
eventoInviaDati dd 0 [ 8] 2
eventoUscitaSottoThread dd 0 [12] 3
;;
..3: a==3#.3a ; non puo' teoricamente essere possibile un evento diverso da 3
; quindi in caso di evento diverso da 3 esce
PostMessage(i, &WM_COMMAND, 1036, "Errore: Evento non previsto") ;
errore
; evento 3 eventoUscitaSottoThread
..3a: ^40==0!#.3c ; il sottoread
BloccaRisorsaSys(UsoSocket)
a=*j+fsock|FcloseSocket_m(a) ; chiude il socket aperto dal
server
LiberaRisorsaSys(UsoSocket)
jnc .3c
PostMessage(i, &WM_COMMAND, 1036, "Errore: Chiusura socket") ;
errore
..3c: PostMessage(i, &WM_COMMAND, 1030, 1) ; cancella la F
PostMessage(i, &WM_COMMAND, 1031, 1) ; cancella la data di connessione
a=^thandle|CloseHandle(a)
..z: ; all'uscita resetta la casella di collegamento
; resetta tutti gli eventi utilizzati in questa funzione e nel sottothread
a=*j+eventi|r=*a+4 |ResetEvent(r) ; resetta eventoUscitaFun
a=*j+eventi|r=*a+8 |ResetEvent(r) ; resetta eventoInvioDati
D*eventoUscitaSottoThread=0 ; eventoUscitaSottoThread e' un handle
a un
; thread non si puo' resettare
s =&*s+2048
>> thandle, argf, fsock, eventi, ifinestra
>b,i,j,k
ret 4


; fa il server in una sola porta per *una sola volta* per un solo indirizzo
esterno
; int __stdcall tcpServerUno_m(u8** argS)
; dove argS=nPort[0], u8* puntatoreAFunzione[4], u8** arg[8], EventoUscita[12]
; EventoUscita e' un puntatore alla dword dell'evento Uscita
; 'puntatoreAFunzione' punta a una funzione del tipo del tipo:
; int funzione(u8** argomento)
; ove *argomento e' il puntatore a FILE_m che rappresenta il socket
; il servizio e' attivo fino a quando l'evento e' attivato
; Stack utilizzabile s=0..256
; sockfp==4..8
; server=16..32 [almeno] client=40..56 [16 bytes]
; htread=64..68 lpThreadId=72..76
; Nerrori=128..132
; 200..204 pointer to returned thread identifier
; 208..220 pointer to argomenti della funzione ecoSleep
; 224..228 hadle del tread risultato
; 0k,4j,8i,12r,16c,20b,24ra, 28P_argS + 256
; 284
; nPorta, P_Pfun, P_argf, P_EventoUscita
; 0 4 8 12
align 4
tcpServerUno_m:
<b,c,r,i,j,k
s-=256
<< nPort=0, nomeF=4, argf=8, eventU=12, sockfp=4, server=16
<< client=40, hThread=64, lpThreadId=72, fd=16
<< Nerrori=128
; iint3
k=1|j=*s+284 |j==0#.2
D*j+nPort<=0?#.2|D*j+nomeF ==0#.2
D*j+argf ==0 #.2|D*j+eventU==0#.2|^Nerrori=0|#.4
; trattamento degli errori
..1: closesocket(i)
..2: a=k
..e: stc|##.f
..4: k=3|D[_socketSta]#.4a|OpenSocket_m()|jc .2
..4a: k=4|socket( &AF_INET, &SOCK_STREAM, 0)|a== -1#.2|i=a
a=*j+nPort|a>=0FFFFh#.1|htons(a) |b=&^server
[b + sin_port ]= ax
htonl( &INADDR_ANY)| [b + sin_addr]=a
W[b + sin_family]= &AF_INET ; b=server struct,
j=socket
D[b + sin_zero ]= 0| D[b+sin_zero+4]=0 ; i=fd
k=5|bind(i, b,16)|a#.1
a=*j+eventU|b=*j+8|*b+4=a
k=6|listen(i, 1) |a#.1
..c0: a=&^client |^lpThreadId=16|r=&^lpThreadId
k=7|^sockfp=Faccept_m(i, a, r, 0, 5 ) ; 5s timeout
; 0 timeout client
a==0#.5 ; se nessuna connessione solo timeout vai a vedere
l'evento
a=^sockfp |r=*j+nomeF|k=8|*b=a ; ricordare che D*b+4 punta
all'evento fine
r(b)|a!=0!#.5|++^Nerrori
..5: a=*j+eventU
WaitForMultipleObjects(1, a, 0, 0)|a==&WAIT_FAILED#.1
a==&WAIT_OBJECT_0#.7 ; se l'evento termine vai alla fine
..6: #.c0
..7: k=10
a=*j+eventU|r=*a|ResetEvent(r) ; resetta eventoUscitathread principale
closesocket(i)|a#.2
a^=a
..f:
>> nPort, nomeF, argf, eventU, sockfp, server
>> client, hThread, lpThreadId, fd
>> Nerrori
s=&*s+256
>b,c,r,i,j,k
ret 4




From: io_x on

"io_x" <a(a)b.c.invalid> ha scritto nel messaggio
news:4c375df7$0$18989$4fafbaef(a)reader5.news.tin.it...
>
> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio
> news:4c3621fb$0$40291$4fafbaef(a)reader2.news.tin.it...
>>
>> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio
>> news:4c26fac9$0$18994$4fafbaef(a)reader5.news.tin.it...
>>> what about this?
>>>
>>> ; int FunzioneDelServer(i8** argm)
>
> programming with event functions is not so difficult
> because it is the first time, never see nothing like that,
> but all ok

yes i found some error too, but because the windows application
not allow to close the server port if first is not close the connection
all seems goes well even if this should not; this is the last post

; int FunzioneDiFunzione(i8** argm)
; argm[0]==fsock, argm[1]=ifinestra
; tale subtrhead
; bloccaLaRisorsa(UsoSocket)
; estrae fd del soket che usa dopo
; liberalarisorsa(UsoSocket)
; .a: usa fd con select per vedere se vi e' un evento read
; se l'evento e' read
; bloccaLaRisorsa(UsoSocket)
; legge il socket
; liberalarisorsa(UsoSocket)
; invia tutto alla finestra
; altrimenti e' levento fine connessione: esci
; goto .a
;0k,4j,8i,12b,16Ra, 20P_Argm + 2048
; 2068
; a=^2068 => *a==socket [FILE_m*], *a+4== ifinestra
align 4
FunzioneDiFunzione:
<b,i,j,k
<< sck=0, ifinestra=4
s-=2048
D*bss_Index=0 ; inizializza il bss_Index per tale connessione
D*bss_buffer=0 ; mette qualche zero all'inizio del buffer di ricezione
j=^2068
..0: BloccaRisorsaSys(UsoSocket)
a=*j+sck|k=*a+16 ; prede fd del socket
LiberaRisorsaSys(UsoSocket)
i=*j+ifinestra
..1: ^20=1|^24=k ; select aspetta indefinitivamente per la lettura - errore -
EOF
c=&*s+20|select(0,c,0,0,0)
..3: a== -1#.f ; se errore select esci
..4: ; iint3
BloccaRisorsaSys(UsoSocket)
r=*j ; "r" punta al FILE per leggere
k==*r+16#.4a|LiberaRisorsaSys(UsoSocket)|#.f ; la connessione e' finita
; potrebbe esser finita per l'evento "eventoUscitaFun"
..4a: ;iint3
a=*bss_bufPointer|c=*bss_bufPointerEnd|FreadCircular(a, c, bss_Index, r)
; scrive quello che il socket invia in un buffer circolare
; che ha sempre la stessa origine e sempre la stessa fine
; tale che
; cambia solo quello che "bss_Index" punta [l'indice in tale array]
; *bss_bufPointerEnd-*bss_bufPointer==2^n allora tale funzione
; ritorna sempre errore
LiberaRisorsaSys(UsoSocket)
jc .e ; CF==1 significa errore per FreadCircular()
c#.f ; se trova EOF
#.5 ; tutto ok
..e: PostMessage(i, &WM_COMMAND, 1036, "Errore: di Fread chiudo la
connessione")
; PostMessage(i, &WM_COMMAND, MD_BTN_CLOSE, 1) ; non necessario
; il di sopra "Message" manda il segnale uscita funzione di funzione
#.f
..5: r=*bss_bufPointer|SetDlgItemTextA(i, MD_ED_RICEVI, r)
##.1
..f: a^=a
..z:
s=&*s+2048
>> sck, ifinestra
>b,i,j,k
ret 4


; int FunzioneDelServer(i8** argm)
;
; Essa:
; 0) scrive nella finestra MD_ED_SERVER una "F" [funzione server attivata]
; 1) crea un thread per stampa input dal socket alla finestra;
; tale subtrhead
; bloccaLaRisorsa(UsoSocket)
; estrae fd del soket che usa dopo
; liberalarisorsa(UsoSocket)
; .a: usa fd con select per vedere se vi e' un evento read
; se l'evento e' read
; bloccaLaRisorsa(UsoSocket)
; legge il socket
; liberalarisorsa(UsoSocket)
; invia tutto alla finestra
; altrimenti e' levento fine connessione: esci
; goto .a
; 2) aspetta indefinitivamente per i messaggi:
; eventoUscitaThread [il primo evento 0]
; comunica l'evento "eventouscitafun" se tale evento non e' uscito
; altrimenti aspetta il sottotread e' finito
; eventoUscitaFun [il seconto dell'array di eventi 4]
; bloccaLaRisorsa(UsoSocket)
; chiude il socket
; liberalarisorsa(UsoSocket)
; cosi' la select del sottotread deve ritornare
; resetta l'evento "eventoUscitaFun"
; goto 2
; eventoInviaDati [il terzo dell'array di eventi 8]
; legge la finestra di invio dati
; bloccaLaRisorsa(UsoSocket)
; scrive la finestra invio dati nel socket
; liberalarisorsa(UsoSocket)
; resetta l'evento "eventoInviaDati"
; se qualche errore setta "eventoUscitaFun"
; goto 2
; eventoUscitaSottoThread [ho capito che si puo' fare 12]
; nel qual caso esce dal loop
; libera le risorse del subthread
; scrive nella finestra MD_ED_SERVER una "" [stringa vuota]
; esce dalla funzione
; 32..36 thandle
; 40..44 led comunicato uscita sottothread
; 44..48 led comunicato uscita thread principale [senza resettarlo]
; 200..1224
; 0k,4j,8i,12b,16Ra, 20P_Argm +2048
; 2068
align 4
FunzioneDelServer:
<b,i,j,k
<< thandle=32, argf=100, fsock=0, eventi=4, ifinestra=8
s-=2048
^40=0 ; led comunicato uscita sottothread
^44=0 ; led comunicato uscita thread
;iint3
j=^2068|i=*j+ifinestra ; *j=socket, *j+4=eventi, *j+8=ifinestra
PostMessage(i, &WM_COMMAND, 1028, 1) ; scrive la F == funzione del server
D*j==0#.z|D*j+4==0#.z
r=argFunzioneDiFunzione ; indirizzo degli argomenti di funzione di
funzione
a=*j+fsock |*r+fsock =a ; socket
|*r+4=i ; la i della finestra in ^4
a=s|CreateThread(0, 0, FunzioneDiFunzione, r, 0, a)|a==0#.z|^thandle=a
*eventoUscitaSottoThread=a ; inizializza l'elemento 4 dell'array di eventi
; riempie le caselle dei dati della connessione
a=s |D*a=0|SetDlgItemTextA(i, MD_ED_RICEVI, a) ; azzera la finestra
ricevi
a=&^200|r=*j+fsock|EstraiDataDalSocket(a, 200, r)|a<=0?#.z
a=&^200|SetDlgItemTextA(i, MD_ED_DATA_CONN , a) ; scrive la data
r=*j|r+=40|a=*r+16 ; a punta a sin_addr
r=&^200|inet_ntoa_m(r, 200, a)|a<=0?#.z
r=&^200|SetDlgItemTextA(i, MD_ED_IP, r) ; scrive l'indirizzo ip del
ricevente
; a=*j+fsock|r=&^200 ; non funziona debug
; EstraiUnNomeNonPuntatoDalSocket(r, 200, a)|a<=0?#.z
; a=&^200|SetDlgItemTextA(i, MD_ED_COL , a) ; scrive il nome
;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] 1
eventoInviaDati dd 0 [ 8] 2
eventoUscitaSottoThread dd 0 [12] 3
;;
..1: a=*j+eventi ; inizia dall'evento eventoUscitaThread
WaitForMultipleObjects(4, a, 0, &INFINITE)|a== &WAIT_FAILED#.3c
; se fallisce wait: end non c'e' niente da fare con tutto il resto
a==0!#.1a ; evento "eventoUscitaThread"
^44=1 ; deve uscire al piu' presto
^40==1!#.1b ; se gia' "eventoUscitaFunzione" e' uscito ... altrimenti
..1b
..100: a=*j+eventi ; inizia dall'evento eventoUscitaThread
a+=12 ; punta a eventoUscitaSottoThread
WaitForMultipleObjects(1, a, 0, &INFINITE) ; aspetta il sottotread
##.3c ;se esce da tale wait vai alla fine
;essendo tole processo in un subtread della finestra
;non dovrebbe influire sulla velocita del thread org.
;che disegna la finestra
..1a: a==1!#.2 ; evento 1 di uscita della funzione
..1b: ^40=1 ; significa che possiamo uscire all'uscita del sottotread
a=*j+eventi|r=*a+4 |ResetEvent(r) ; resetta eventoUscitaFun
BloccaRisorsaSys(UsoSocket)
a=*j+fsock|FcloseSocket_m(a) ; chiude il socket aperto dal server
LiberaRisorsaSys(UsoSocket)
jnc .1c
PostMessage(i, &WM_COMMAND, 1036, "Errore: Chiusura socket") ;
scrive errore
..1c: ^44#.100 ; se e' pastato dalla parte "chiudi thread generale"
; aspetta la fine del subtread "funzione di funzione"
##.1
;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] 1
eventoInviaDati dd 0 [ 8] 2
eventoUscitaSottoThread dd 0 [12] 3
;;
..2: a==2!#.3 ; evento 2 invio dati dalla finestra a socket
;iint3
a=&^200|GetDlgItemTextA(i, MD_ED_MANDA, a, 1024)
^0=a ; in *s li numero dei caratteri da spedire
^4=0 ; in *s+4 il numero degli errori
BloccaRisorsaSys(UsoSocket)
a=*j|a+=20 ; "a" punta al FILE per scrivere
c=^0|r=&^200|Fwrite_m (r, 1, c, a)|^4++=0
a=*j|a+=20 |Fflush_m(a)|^4++=0
LiberaRisorsaSys(UsoSocket)
^4==0#.2b
PostMessage(i, &WM_COMMAND, 1036, "Errore: Spedizione non riuscita")
; errore
a=*j+eventi|r=*a+4|SetEvent(r) ; se errore setta eventoUscitaFun =>
esci
..2b: a=*j+eventi |r=*a+8|ResetEvent(r) ; resetta eventoInviaDati
^44#.100 ; servira' a qualche cosa?
##.1
;;
eventoUscitaThread dd 0 [ 0] 0
eventoUscitaFun dd 0 [ 4] 1
eventoInviaDati dd 0 [ 8] 2
eventoUscitaSottoThread dd 0 [12] 3
;;
..3: a==3#.3a ; non puo' teoricamente essere possibile un evento diverso da 3
; quindi in caso di evento diverso da 3 esce
PostMessage(i, &WM_COMMAND, 1036, "Errore: Evento non previsto") ;
errore
; evento 3 eventoUscitaSottoThread
..3a: ^40==0!#.3c ; il sottoread
BloccaRisorsaSys(UsoSocket)
a=*j+fsock|FcloseSocket_m(a) ; chiude il socket aperto dal
server
LiberaRisorsaSys(UsoSocket)
jnc .3c
PostMessage(i, &WM_COMMAND, 1036, "Errore: Chiusura socket") ;
errore
..3c: PostMessage(i, &WM_COMMAND, 1030, 1) ; cancella la F
PostMessage(i, &WM_COMMAND, 1031, 1) ; cancella la data di connessione
a=^thandle|CloseHandle(a)
..z: ; all'uscita resetta la casella di collegamento
; resetta tutti gli eventi utilizzati in questa funzione e nel sottothread
a=*j+eventi|r=*a+4 |ResetEvent(r) ; resetta eventoUscitaFun
a=*j+eventi|r=*a+8 |ResetEvent(r) ; resetta eventoInvioDati
D*eventoUscitaSottoThread=0 ; eventoUscitaSottoThread e' un handle
a un
; thread non si puo' resettare
s =&*s+2048
>> thandle, argf, fsock, eventi, ifinestra
>b,i,j,k
ret 4



First  |  Prev  | 
Pages: 1 2 3 4
Prev: Delphi 2007 move routine flawed ?
Next: what timer?