AST examen 19/20 PDF

Title AST examen 19/20
Course Aplicacions i Serveis Telematics
Institution Universitat Politècnica de Catalunya
Pages 15
File Size 143.4 KB
File Type PDF
Total Downloads 93
Total Views 152

Summary

Examen AST 2020...


Description

ESCOLA TÈCNICA SUPERIOR D’ENGINYERIA DE TELECOMUNICACIÓ DEPARTAMENT D’ENGINYERIA TELEMÀTICA APLICACIONS I SERVEIS TELEMÀTICS Examen Final (16/01/2020) Notes Prov.: Dilluns 20 Gener. Revisió Presencial: Dimecres 22 Gener, 10:30h Lab AST.

Problema 1 (2.5 punts). Monitors Suposem un escenari on hi ha threads de tipus donant i threads de tipus receptor. En aquest escenari els fils donants fan donacions als fils receptors, on el valor de les donacions són enters positius. La transferència de donacions es fa mitjançant el monitor Transferencia que disposa de dos mètodes: public void donar(int q) i public int rebre(). Els donants invoquen donar(d) per oferir una donació de quantitat d. Invocant rebre(), un receptor rep un pack de P donacions. La mida del pack és constant, P donants diferents, i el valor que rep correspon a la suma de les donacions dels P donants. Es demana implementar el monitor Transferencia. Els mètodes donar(d) i rebre() no poden completar fins que hi ha presents P donants i un receptor per a fer la transacció. Un cop existeix un grup de P donants i un receptor, les donacions d’aquests P donants no poden anar a un altre receptor!.

SOLUCIÓ:

p u b l ic c l a s s T r a n s f e r e n c i a { p r o t e ct e d f i n a l in t P = 1 0; p r o t e c t e d R e e n t r a n t L o c k mon ; p r o t e c t e d C o n d i t i o n p o d e r A c ce d ir , f e r T r a n s a c c i o , d o n a c i o F e t a ; p r o t e c t e d i n t d on an ts , q u a n t i t a t D o n a c i o ; p r o t e c t e d b o ol e a n r e c e p t o r , f e n tD o n ac i o ;

p u b l i c v oi d d ona r ( i n t q ) { mon . l o c k ( ) ; w h i le ( f e n t D o n a c i o ) { pod e r Acced ir . await ( ) ; } d o n a nt s = d o na n t s + 1 ; i f ( d on a nt s == P ) { f e n t Do n acio = t r u e ; } i f ( r e c e p t o r && d o na nt s == P ) { fe rTransaccio . signa lAll () ; } else { f e r T r a n s a c c i o . a wa it ( ) } quantitatDonacio = quantitatDonacio + q ; donants = donants − 1; i f ( d o n an ts == 0) { d onacioF e ta . si g n al ( ) ; } mon . u nl o c k ( ) ; } public i nt r e br e ( ) { mon . l o c k ( ) ; w hil e ( r e c e p t o r ) { pod e r Acced ir . await ( ) } receptor = true ; i f ( d on a nt s == P ) { fe rTransaccio . signa lAll () ; } else { f e r T r a n s a c c i o . a wa it ( ) } i f ( d o n an ts > 0 ) { d onacioF e ta . await ( ) ; } in t r e s = quantitatDonacio ; f e n t Do n acio = f a l s e ; receptor = false ; quantitatDonacio = 0; p o d e r A cc e d ir . s i g n a l A l l ( ) ; mon . u nl o c k ( ) ; return res ; } }

Problema 2 (2.5 punts). Pas de missatges. Resoldre el problema anterior amb pas de missatges (sockets) i servidor multithreading. Cal implementar el patró stub-skeleton (a vegades dit: Representant monitor-Assistent client o Proxy-Worker). Qui vulgui fer servir Strings per a transmetre sencers pot utilitzar els conversors: String toString(int i) i int Integer.parseInt(String i).

SOLUCIÓ: / /−−−−−−−−−−−−− c l i e n t −−−−−−−−−−−−−−−−−−−− p u b l ic c l a s s T r a n s f e r e n c i a { p u b l i c v oi d d ona r ( i n t q ) { try { So ck e t s = new S oc k e t ( " l o c a l h o s t " , 22 2 2) ; O b j e ct Ou t p ut St r e a m o u t = new O b j e c tO ut p ut S tr e am ( s . g e tO ut pu tS tr e a m ( ) ) ; O b j e c t I n p u t S t r e a m i n = new O b j e c t I n p u t S t r e a m ( s . g e t I n p u t S t r e a m ( ) ) ; o u t . wr ite UTF ( " d o n a r " ) ; out . w r it e I n t ( q ) ; ou t . f l u sh ( ) ; i n . re ad UTF ( ) ; o ut . c l o s e ( ) ; in . clo se ( ) ; s . close ( ) ; } c a t c h ( I O Ex c e p ti on e x ) { ex . p r in t St a c k Tr a c e ( ) ; } } public i nt r e br e ( ) { in t v = 0; try { So ck e t s = new S oc k e t ( " l o c a l h o s t " , 22 2 2) ; O b j e ct Ou t p ut St r e a m o u t = new O b j e c tO ut p ut S tr e am ( s . g e tO ut pu tS tr e a m ( ) ) ; O b j e c t I n p u t S t r e a m i n = new O b j e c t I n p u t S t r e a m ( s . g e t I n p u t S t r e a m ( ) ) ; o ut . wr ite UTF ( " r e b r e " ) ; ou t . f l u sh ( ) ; v = in . re ad Int () ; o ut . c l o s e ( ) ; in . clo se ( ) ; s . close ( ) ; return v; } c a t c h ( I O Ex c e p ti on e x ) { ex . p r in t St a c k Tr a c e ( ) ; } return v; } } / /−−−−−−−−−−−−−−−−−−−−− s e r v i d o r −−−−−−−−−−−−−−−−−−−−− public cl as s Se r vid or { p u b l i c s t a t i c v oi d main ( S t r i n g [ ] a r g s ) th r o ws I O Ex ce pt io n { T r a n s f e r e n c i a p = new T r a n s f e r e n c i a ( 5 ) ; S e r v e r S o c k e t s s = new S e r v e r S o c k e t ( 2 22 2 ) ; w hil e ( t r u e ) { S oc k e t s = s s . a c c e p t ( ) ; new A s s i s t e n t C l i e n t ( p , s ) . s t a r t ( ) ; } } } p u b l i c c l a s s A s s i s t e n t C l i e n t e x t e n d s T hr e a d { private private

fin a l Transfe re ncia t ; f i n a l Sock e t s ;

p u b l ic A s s i s t e n t C l i e n t ( T r a n s f e r e n c i a t , S oc k e t s ) { this . t = t ; this . s = s ; } @ Ove r rid e

p u b l i c v oi d r un ( ) { try { O b j e ct Ou t p ut St r e a m o u t = new O b j e c tO ut p ut S tr e am ( s . g e tO ut pu tS tr e a m ( ) ) ; O b j e c t I n p u t S t r e a m i n = new O b j e c t I n p u t S t r e a m ( s . g e t I n p u t S t r e a m ( ) ) ; S t r i n g me tod e = i n . r eadUTF ( ) ; s w i t c h ( me tod e ) { case " donar " : int q = in . re ad Int () ; t . d onar ( q ) ; o u t . wr ite UT F ( " ok " ) ; ou t . f l u sh ( ) ; break ; c as e " r e b r e " : in t v = t . r e br e ( ) ; out . w r it e I n t ( v ) ; ou t . f l u sh ( ) ; } o ut . c l o s e ( ) ; in . clo se ( ) ; s . close ( ) ; } c a t c h ( I O Ex c e p ti on e x ) { ex . p r in t St a c k Tr a c e ( ) ; } } }

Problema 3 (2.5 punts). Protocols L’Stream Control Transmission Protocol (SCTP) és un protocol de transport semblant a TCP i UDP. Es diferencia d’aquests protocols en que permet connectar-se a més d’una xarxa i disposar de paths redundants. Per establir una connexió, STCP fa servir un 4-way handshake, que permet reduir la vulnerabilitat a atacs de recurs com el SYN flood. Tenim que: 1. El socket client en el mètode connect() envia un segment de tipus INIT. 2. El socket servidor en rebre l’INIT respon amb un segment de tipus INIT_ACK_COOKIE que conté una cookie. El servidor guarda la cookie enviada a la variable cookie. 3. El client en rebre el segment INIT_ACK_COOKIE extreu la cookie i la reenvia en un segment de tipus COOKIE_ECHO. 4. En rebre el segment COOKIE_ECHO el servidor extreu la cookie i comprova si és igual a la cookie que havia enviat. • si són iguals: (a) Crea un nou TSocket. Aquest nou TSocket envia un segment de tipus COOKIE_ACK i passa a l’estat ESTABLISHED. (b) El nou TSocket és el que retorna el mètode accept(). Això es fa mitjançant la variable acceptSocket que es pot considerar com una cua d’un sol element. (c) El socket servidor torna a l’estat LISTEN • si no són iguals no fa res. (Això és per simplicitat). 5. En rebre el segment de tipus COOKIE_ACK, el socket client passa a l’estat ESTABLISHED. En aquest exercici es demana simular l’establiment de connexió d’STCP de manera simplificada. Per això se suposa que: 1. El canal NO té pèrdues ni errors. 2. Mentre s’està establint una connexió, cap altre socket client intenta establir-ne una altra. 3. Es disposa de les classes Cookie i STCPSegment amb mètodes per a realitzar les operacions necessàries (que no cal implementar). 4. Per enviar segments es disposa del mètode sendSegment. Important: els mètodes connect() i accept() tenen semàntica bloquejant. El mètode connect() no pot retornar fins que l’estat és ESTABLISHED i el mètode accept() fins que el TSocket que retorna està en estat ESTABLISHED.

p u b l i c c l a s s TSock etSTCP { p r o t e c t e d Lock l k ; p r o t e c t e d C o n d i t i o n appCV ; protected int state ; p r o t e c t e d Th re ad t a s k ; Cha nn e l c ha n n e l ; / / Se r vid or p r o t e c t e d TSocke tSTCP a c c e p t S o c k e t ; p r o t e c t e d Cook ie c o o k ie ; / / Tip u s s e g me nt p r o t e c t e d f i n a l s t a t i c i n t I NI T = 10 , INIT_ACK_COOKIE = 20 , COOKIE_ECHO = 30 , COOKIE_ACK = 4 0 ; // Estats : p r o t e c t e d f i n a l s t a t i c i n t CLOSED = 0 , LISTEN = 1 , INIT_SENT = 2 , ECHO_SENT = 3 , COOKIE_SENT = 4 , ESTABLISHED = 5 ; p r o t e c t e d TSock etSTCP ( Chan ne l c ) { t a s k = new T hr e a d ( new R e c e i v e r Ta sk ( ) ) ; task . st a r t ( ) ; c ha n n e l = c ; l k = new R e e nt r a n t Lo c k ( ) ; appCV = l k . n e w Co nd it io n ( ) ; s t a t e = CLOSED; } p r o t e c t e d v oi d l i s t e n ( ) { s t a t e = LISTEN ; } p u b l i c TSocke tSTCP a c ce p t ( ) t hr o w s I n t e r r u p t e d E x c e p t i o n { / / C o mp l e t a r . . . . } p r o t e c t e d vo id c on n e ct ( ) t hr o w s I n t e r r u p t e d E x c e p t i o n { / / C o mp l e t a r . . . . } p r o t e c t e d v oi d p r o c e s sR e ce i ve d Se g me n t ( STCPSegme nt r e b u t ) { / / C o mp l e t a r . . . . } p r o t e c t e d v oi d s e t S t a t e ( i n t n e w S t a t e ) { s t a t e = ne wState ; } p r o t e c t e d v oi d s e nd Se gme nt ( STCPSegment se g ) { / / no c a l i mp le me n t ar } c l a s s R e c e iv e r T a sk im p l e me nts Run nab le { p u b l i c v oi d r un ( ) { w hil e ( t r u e ) { STCPSe gment r s e g = c ha nn e l . r e c e i v e ( ) ; p r o c e s s Re c e i v e d S e g m e n t ( r s e g ) ; } } }

} c l a s s Coo k ie { p u b l i c s t a t i c C ook ie ne wCook ie ( ) ; p u b l i c b oo l e a n e q u al s ( ) ; } c l a s s STCPSegme nt { p u b l i c STCPSegment ( i n t t y pe ) ; p u b l i c i n t g e tT ype ( ) ; p u b l i c v o i d s e t C o o k i e ( C oo k ie c ) ; p u b l i c Cook ie g e t Co ok ie ( ) ; p u b l i c v oi d s e t Da t a ( i n t d ) ; p u b l i c i n t g e tD a ta ( ) ; p u b l i c v oi d se tWind ow ( i n t w) ; p u b l i c v oi d setAckNum ( i n t n ) ; p u b l i c v oi d setN umSe q ( i n t n ) ; p u b l i c i n t getWind ow ( ) ; p u b l i c i n t getAckNum ( ) ; p u b l i c i n t getN umSeq ( ) ; }

SOLUCIÓ: p u b l i c c l a s s TSock etSTCP { p r o t e c t e d Lock l k ; p r o t e c t e d C o n d i t i o n appCV ; protected int state ; p r o t e c t e d Th re ad t a s k ; Cha nn e l c ha n n e l ; / / Se r vid or p r o t e c t e d TSocke tSTCP a c c e p t S o c k e t ; p r o t e c t e d Cook ie c o o k ie ; / / Tip u s s e g me nt p r o t e c t e d f i n a l s t a t i c i n t I NI T = 10 , INIT_ACK_COOKIE = 2 0 , COOKIE_ECHO = 30 , COOKIE_ACK = 4 0 ; // Estats : p r o t e c t e d f i n a l s t a t i c i n t CLOSED = 0 , LISTEN = 1 , INIT_SENT = 2 , ECHO_SENT = 3 , COOKIE_SENT = 4 , ESTABLISHED = 5 ;

p r o t e c t e d TSock etSTCP ( Chan ne l c ) { t a s k = new T hr e a d ( new R e c e i v e r Ta sk ( ) ) ; task . st a r t ( ) ; c ha n n e l = c ; l k = new R e e nt r a n t Lo c k ( ) ; appCV = l k . n e w Co nd it io n ( ) ; s t a t e = CLOSED; } p r o t e c t e d v oi d l i s t e n ( ) { s t a t e = LISTEN ; } p u b l i c TSocke tSTCP a c ce p t ( ) t hr o w s I n t e r r u p t e d E x c e p t i o n { lk . lock ( ) ; w hi l e ( a c c e p t S o c k e t == n u l l ) { t h i s . appCV . a w a i t ( ) ; } TSocke tSTCP tmp = a c c e p t S o c k e t ; acce ptSock e t = nu ll ; l k . u n lo c k ( ) ; r e t u r n tmp ; } p r o t e c t e d vo id c on n e ct ( ) t hr o w s I n t e r r u p t e d E x c e p t i o n { lk . lock ( ) ; se n d Se gme nt ( new STCPSegme nt ( IN I T ) ) ; t h i s . s t a t e = INIT_SENT ; w hil e ( s t a t e != ESTABLISHED) { appCV . a w a i t ( ) ; } l k . u n lo c k ( ) ; } p r o t e c t e d v oi d p r o c e s sR e ce i ve d Se g me n t ( STCPSegme nt r e b u t ) { lk . lock ( ) ;

try { i n t t ip u sS e gm e nt = r e b u t . g e tT ype ( ) ; switch ( s t a t e ) { c a s e LISTEN : { i f ( t i p u s S e g m e n t == I NI T ) { STCPSe gment s e g = new STCPSegment ( INIT_ACK_COOKIE ) ; c o o k ie = Co ok ie . ne wCook ie ( ) ; seg . se tCook ie ( cook ie ) ; se n d Se gme nt ( s e g ) ; s t a t e = COOKIE_SENT ; } break ; } c a s e COOKIE_SENT : { i f ( t i p u s S e g m e n t == COOKIE_ECHO) { Cook i e c = r e b u t . g e t C oo k i e ( ) ; i f ( c . e q u a l s ( c o ok i e ) ) { TSocke tSTCP n ou S o ck e t = new TSocke tSTCP ( c ha n n e l ) ; no u So c k e t . s e t S t a t e ( ESTABLISHED) ; no uSo ck e t . s e nd Se g me n t ( new STCPSegme nt ( COOKIE_ACK) ) ; a c c e p t S o c k e t = n ouS oc k e t ; s t a t e = LISTEN ; appCV . s i g n a l A l l ( ) ; } else { / / E n u n c i a t d i u no f e r r e s } } break ; } c a s e INIT_SENT : { i f ( t i p u s S e g me n t == INIT_ACK_COOKIE ) { STCPSe gment s e g = new STCPSegme nt ( COOKIE_ECHO) ; s e g . s e t C o o k i e ( r e b u t . g e t Co o k ie ( ) ) ; se n d Se gme nt ( s e g ) ; s t a t e = ECHO_SENT; } break ; } c a s e ECHO_SENT: { i f ( t i p u s S e g m e n t == COOKIE_ACK) { s t a t e = ESTABLISHED; appCV . s i g n a l A l l ( ) ; } break ; } c a se ESTABLISHED : / / P r o c e s s s e gm e nt t e x t break ; } } finally { l k . u n lo c k ( ) ; } } p r o t e c t e d v oi d s e t S t a t e ( i n t n e w S t a t e ) { s t a t e = ne wState ; } p r o t e c t e d v oi d s e nd Se gme nt ( STCPSegment se g ) { / / no c a l i mp le me n t ar }

c l a s s R e c e iv e r T a sk im p l e me nts Run nab le { p u b l i c v oi d r un ( ) { w hil e ( t r u e ) { STCPSe gment r s e g = c ha nn e l . r e c e i v e ( ) ; p r o c e s s Re c e i v e d S e g m e n t ( r s e g ) ; } } } }

Problema 4 (2.5 punts). Protocols Es vol implementar un protocol per a la transmissió d’enters mitjançant la classe TSocketFlux que combina ARQ stop-andwait i control de flux (considerant el cas finestra 0). Per a enviar els enters s’utilitza el mètode sendSegment(STCPSegment), és a dir, s’envia un segment que conté un únic enter com a dada. Feu servir la classe STCPSegment de l’exercici anterior. Observar que per simplicitat en la simulació no s’utilizen ports. p u b l i c c l a s s T So ck e tF lux { p r o t e c t e d f i n a l i n t MIDA_CUA_RECEPCIO = 3 ; p r o t e c t e d Lock l k ; p r o t e c t e d C o n d i t i o n appCV ; / / Sen der v a r i a b l e s : p r o t e c t e d i n t ne xtToBe Snd ; prote cte d in t fine straPe rme sa ; p r o t e c t e d STCPSegment unAck e dSe gment ; / / Re ce iv e r v a r i a b l e s : p r o t e c t e d i n t nextToBe Rcv ; p r o t e c t e d C i r c ul a r Q ue ue < I n t e g e r > r c vQ ue u e ; / / Tip u s s e g me nt p r o t e c t e d f i n a l s t a t i c i n t DATA = 0 , ACK = 5 0; p u b l i c T Soc k e tF l ux ( ) { l k = new R e e nt r a n t Lo c k ( ) ; appCV = l k . n e w Co nd it io n ( ) ; r cvQu e ue = new C ir c u l a r Q u e u e < >(MIDA_CUA_RECEPCIO) ; fine straPe rme sa = 1; } / / −−−−−−−−−−−−− SENDER PART −−−−−−−−−−−−−−− p u b l i c v oi d s e nd Da ta ( I n t e g e r e ) { lk . lock ( ) ; try { / / C o mp l e t a r . . . . } f i n a l l y { l k . un l o c k ( ) ; } } p r o t e c t e d v o id t i m e o u t ( ) { lk . lock ( ) ; try { / / C o mp l e t a r . . . . } f i n a l l y { l k . un l o c k ( ) ; }

}

p r o t e c t e d v oi d s e nd Se gme nt ( STCPSegment se g ) { / / no c a l im p l e me n t ar } p r o t e c t e d v oi d st ar t RTO ( ) { / / s e s u p o s a im pl e m e n ta t } p r o t e c t e d v oi d stopRTO ( ) { / / s e s u p o s a im pl e m e n ta t } / / −−−−−−−−−−−−− RECEIVER PART −−−−−−−−−−−−−−− publ ic I nt e ge r r e ce ive Dat a ( ) { lk . lock ( ) ; try { w hil e ( r cv Que ue . empty ( ) ) { appCV . a w a i t ( ) ; } r e t u r n r cv Que ue . g e t ( ) ; } f i n a l l y { lk . u n l o c k ( ) ; } } p r o t e c t e d v oi d se nd Ack ( ) { / / C o mp l e t a r . . . . } / / −−−−−−−−−−−−− SEGMENT ARRIVAL −−−−−−−−−−−−− p r o t e c t e d v oi d p r o c e s sR e ce i ve d Se g me n t ( STCPSegme nt r se g ) { lk . lock ( ) ; try { i f ( r s e g . g e t Ty pe ( ) == ACK) {

/ / C o mp l e t a r . . . . } i f ( r s e g . g e t Ty pe ( ) == DATA) { / / C o mp l e t a r . . . . } } f i n a l l y { l k . un l o c k ( ) ; } } }

SOLUCIÓ: p u b l i c c l a s s T So ck e tF lux { p r o t e c t e d f i n a l i n t MIDA_CUA_RECEPCIO = 3 ; p r o t e c t e d Lock l k ; p r o t e c t e d C o n d i t i o n appCV ; / / Sen der v a r i a b l e s : p r o t e c t e d i n t ne xtToBe Snd ; prote cte d in t fine straPe rme sa ; p r o t e c t e d STCPSegment unAck e dSe gment ; / / Re ce iv e r v a r i a b l e s : p r o t e c t e d i n t nextToBe Rcv ; p r o t e c t e d C i r c ul a r Q ue ue < I n t e g e r > r c vQ ue u e ; / / Tip u s s e g me nt p r o t e c t e d f i n a l s t a t i c i n t DATA = 0 , ACK = 5 0; p u b l i c T Soc k e tF l ux ( ) { l k = new R e e nt r a n t Lo c k ( ) ; appCV = l k . n e w Co nd it io n ( ) ; r cvQu e ue = new C ir c u l a r Q u e u e < >(MIDA_CUA_RECEPCIO) ; fine straPe rme sa = 1; } / / −−−−−−−−−−−−− SENDER PART −−−−−−−−−−−−−−− p u b l i c v oi d s e nd Da ta ( I n t e g e r e ) { lk . lock ( ) ; try { w hil e ( unAck e dSe gment != n u l l ) { appCV . a w a i t U n i n t e r r u p t i b l y ( ) ; } unAck e dSe gment = new STCPSe gment (DATA) ; unAck e dSe gment . s e t D a t a ( e ) ; unAck e dSe gment . setNumSe q ( ne xtToBe Snd ) ; ne xtT oB eSnd = ne xtTo Be Snd + 1 ; if ( fine straPe rme sa > 0) { se n d Se gme nt ( unAck e d Segme nt ) ; } st a r t RT O ( ) ; } finally { l k . u n lo c k ( ) ; } } p r o t e c t e d v oi d s e nd Se gme nt ( STCPSegment se g ) { } p r o t e c t e d v o id t i m e o u t ( ) { lk . lock ( ) ; try { se n d Se gme nt ( unAck e d Segme nt ) ; st a r t RT O ( ) ; } finally { l k . u n lo c k ( ) ; } } p r o t e c t e d v oi d st ar t RTO ( ) { } p r o t e c t e d v oi d stopRTO ( ) { } / / −−−−−−−−−−−−− RECEIVER PART −−−−−−−−−−−−−−− publ ic I nt e ge r r e ce ive Dat a ( ) { lk . lock ( ) ;

try { w hil e ( r cv Que ue . empty ( ) ) { appCV . a w a i t U n i n t e r r u p t i b l y ( ) ; } r e t u r n r cv Que ue . g e t ( ) ; } finally { l k . u n lo c k ( ) ; } } p r o t e c t e d v oi d se nd Ack ( ) { STCPSe gment ack = new STCPSegment (ACK) ; ack . setAckN um ( ne xtToBe Rcv ) ; ack . se tWind ow ( r cvQ ue ue . f r e e ( ) ) ; se n d Se gme nt ( ac k ) ; } / / −−−−−−−−−−−−− SEGMENT ARRIVAL −−−−−−−−−−−−− p r o t e c t e d v oi d p r o c e s sR e ce i ve d Se g me n t ( STCPSegme nt r se g ) { lk . lock ( ) ; try { i f ( r s e g . g e t Ty pe ( ) == ACK) { i f ( r s e g . getAckNum ( ) == ne xtToB eSnd ) { stopRTO ( ) ; unAck e dSe gment = n u l l ; f i n e s t r a P e r m e s a = r s e g . getWind ow ( ) ; appCV . s i g n a l ( ) ; } } i f ( r s e g . g e t Ty pe ( ) == DATA) { i f ( r cv Que ue . f u l l ( ) ) { return ; } i f ( r s e g . getN umSeq ( ) == nex tToB eRcv ) { r cvQ ue ue . p ut ( r s e g . g e t D at a ( ) ) ; nex tToBe Rcv = n extTo Be Rcv + 1 ; appCV . s i g n a l ( ) ; } send Ack ( ) ; } } finally { l k . u n lo c k ( ) ; } } }...


Similar Free PDFs