@@ -52,7 +52,7 @@ void createSocket(char* addr, char* port);
5252
5353/* Functions declaration */
5454static Byte* q_get (QTYPE *);
55- static int rcvframe (int sockfd, QTYPE *q);
55+ static int rcvframe (QTYPE *q);
5656pair<int , string> convbuf (char * c);
5757string convRESPtostr (int res, int msgno);
5858
@@ -63,7 +63,7 @@ socklen_t addrlen = sizeof(serv_addr), clilen = sizeof(cli_addr);
6363void *childProcess (void *threadid);
6464void sendACK (int framenum);
6565void sendNAK (int framenum);
66-
66+ void initRXQ (QTYPE*);
6767// SERVER PROGRAM
6868int main (int argc, char *argv[]){
6969// create socket
@@ -72,7 +72,7 @@ int main(int argc, char *argv[]){
7272/* Initialize XON/XOFF flags */
7373send_xon = true ;
7474send_xoff = false ;
75-
75+ initRXQ (rxq);
7676/* Create child process */
7777pthread_t child_thread;
7878int rc = pthread_create (&child_thread, NULL , childProcess, (void *)0 );
@@ -83,23 +83,22 @@ int main(int argc, char *argv[]){
8383
8484/* ** IF PARENT PROCESS ***/
8585while (true ){
86- printf (" parent thread\n " );
87- int ret = rcvframe (sockfd, rxq);
88- printf (" selesai parent\n " );
86+ int ret = rcvframe (rxq);
8987}
9088
9189pthread_join (child_thread, NULL );
9290pthread_exit (NULL );
9391return 0 ;
9492}
95-
9693/* function for reading character and put it to the receive buffer*/
9794
9895/* q_get returns a pointer to the buffer where data is read
9996 * or NULL if buffer is empty
10097 */
10198static Byte* q_get (QTYPE *q){
10299Byte* current;
100+ puts (" MASUK QGET" );
101+ printf (" %d\n " , q->count );
103102/* Nothing in the queue */
104103if (!q->count ) return (NULL );
105104if (q->data [q->front ] == 0xFF ) return (NULL );
@@ -127,21 +126,16 @@ static Byte* q_get(QTYPE *q){
127126return current;
128127}
129128
130- static int rcvframe (int sockfd, QTYPE *q){
129+ static int rcvframe (QTYPE *q){
131130memset (recvbuf, 0 , sizeof recvbuf);
132- printf (" masuk recvframe\n " );
133131int byte_recv = recvfrom (sockfd, recvbuf, sizeof (recvbuf), 0 , (struct sockaddr *)&cli_addr, &clilen);
134- // printf("%d\n", byte_recv);
135132if (byte_recv < 0 ){ // error receiving character
136133printf (" Error receiving: %d" , byte_recv);
134+ return -1 ;
137135}
138- for (int i = 0 ; recvbuf[i] != ETX; ++i){
139- printf (" %d " , recvbuf[i]);
140- }
141- puts (" " );
142136pair<int ,string> M = convbuf (recvbuf);
143137printf (" M.first dari convbuf(recvbuf): %d\n " , M.first );
144- if (M.se != " " ){ // dia ga error
138+ if (M.se != " " && M. fi != - 1 && q-> data [M. fi ] == 0xFF ){ // dia ga error
145139printf (" Menerima frame ke-%d: %s\n " , M.fi , M.se .c_str ());
146140// receive buffer above minimum upperlimit
147141// sending XOFF
@@ -151,16 +145,19 @@ static int rcvframe(int sockfd, QTYPE *q){
151145if (M.fi <= q->rear ){
152146if (M.fi >= q->front ){
153147strncpy ((char *)msg[M.fi ], M.se .c_str (), M.se .length ());
148+ q->data [M.fi ] = M.fi ;
154149}
155150else if (q->front > q->rear ){
156151strncpy ((char *)msg[M.fi ], M.se .c_str (), M.se .length ());
152+ q->data [M.fi ] = M.fi ;
157153}
158154else {
159155// bagi dua lagi, apakah ada didalem batas apa nggak, ini ditulis soalnya bisa aja dia sebenernya lanjutannya tapi udah muter
160156if ((M.fi + 1 ) + RXQSIZE - q->front < WINDOWSIZE){
161157q->count = M.fi + 1 + RXQSIZE - q->front ;
162158q->rear = M.fi ;
163159strncpy ((char *)msg[q->rear ], M.se .c_str (), M.se .length ());
160+ q->data [M.fi ] = M.fi ;
164161lastrecv = q->rear ;
165162}
166163else {
@@ -175,6 +172,7 @@ static int rcvframe(int sockfd, QTYPE *q){
175172q->count = M.fi + 1 + RXQSIZE - q->front ;
176173q->rear = M.fi ;
177174strncpy ((char *)msg[q->rear ], M.se .c_str (), M.se .length ());
175+ q->data [M.fi ] = M.fi ;
178176lastrecv = q->rear ;
179177}
180178}
@@ -184,6 +182,7 @@ static int rcvframe(int sockfd, QTYPE *q){
184182q->count = M.fi - q->front + 1 ;
185183q->rear = M.fi ;
186184strncpy ((char *)msg[q->rear ], M.se .c_str (), M.se .length ());
185+ q->data [M.fi ] = M.fi ;
187186lastrecv = q->rear ;
188187}
189188}
@@ -199,9 +198,7 @@ static int rcvframe(int sockfd, QTYPE *q){
199198}
200199}
201200else {
202- printf (" di recvframe\n " );
203201sendNAK (q->front );
204- printf (" di recvframe\n " );
205202}
206203return M.fi ;
207204}
@@ -249,15 +246,11 @@ pair<int, string> convbuf(char* buf){
249246}
250247unsigned char t[MAXLEN << 1 ]; // for checksum
251248memset (t,0 ,sizeof t);
252- printf (" HAHAHAHA" );
253249for (int i = 0 ;i < checkstr.length (); ++i){
254250t[i] = (Byte)checkstr[i];
255- printf (" %d" , t[i]);
256251}
257- puts ( " " );
252+
258253unsigned int checksum = crc32a (t);
259- // ////////debug checksum. status : belum lewat///////////////////////
260- printf (" %u %u\n " , checksum, check);
261254if (checksum != check) return make_pair (-1 , " " );
262255return res;
263256}
@@ -266,16 +259,17 @@ string convRESPtostr(int res, int msgno){
266259RESP R;
267260R.res = res;
268261R.msgno = msgno;
269- unsigned char * uc = new unsigned char [3 ];
262+ unsigned char uc[3 ];
263+ memset (uc, 0 , sizeof uc);
270264uc[0 ] = R.res ;
271265uc[1 ] = R.msgno ;
272266R.checksum = crc32a (uc);
273- memset (sendbuf, 0 , sizeof sendbuf);
274267string s = " " ;
275268s += (char )R.res ;
276269s += (char )R.msgno ;
277270s += to_string (R.checksum );
278- strncpy (sendbuf, s.c_str (), s.length ());
271+ return s;
272+
279273}
280274
281275void *childProcess (void *threadid){
@@ -287,35 +281,28 @@ void *childProcess(void *threadid){
287281
288282if (now != NULL ){
289283printf (" Mengkonsumsi byte ke-%d.\n " , *now);
290- printf (" numframe : %d\n " , *now);
291284sendACK (*now);
292- printf (" ack sent!\n " );
293- sleep (2 );
294285// usleep(DELAY * 10000000);
295286*now = 0xFF ;
296287}
297288else {
298289// printf("ANAK PIPIN :3\n");
299290if (rxq->count != 0 ){
300- printf (" di child\n " );
301291sendNAK (rxq->front );
302- printf (" before usleep\n " );
303- sleep (2 );
304292}
305293}
294+ sleep (1 );
306295}
307296pthread_exit (NULL );
308297}
309298
310299void sendACK (int framenum){
311300string s = convRESPtostr (ACK, framenum);
312301memset (sendbuf, 0 , sizeof sendbuf);
313- cout << s << endl ;
302+ puts (s. c_str ()) ;
314303for (int i = 0 ;i < s.length (); ++i){
315- printf (" done resp conv : %d\n " , s[i]);
316304sendbuf[i] = s[i];
317305}
318- printf (" SEND ACK!\n " );
319306// kayaknya ini masih ngebug
320307int send_ack = sendto (sockfd, sendbuf, sizeof (sendbuf), 0 , (struct sockaddr *)&cli_addr, clilen);
321308if (send_ack < 0 ){// error sending ACK character
@@ -329,11 +316,13 @@ void sendNAK(int framenum){
329316for (int i = 0 ;i < s.length (); ++i){
330317sendbuf[i] = s[i];
331318}
332- printf (" SEND NAK!\n " );
333319int send_ack = sendto (sockfd, sendbuf, sizeof (sendbuf), 0 , (struct sockaddr *)&cli_addr, clilen);
334- printf (" done send nak\n " );
335320if (send_ack < 0 ){// error sending ACK character
336321printf (" Error send NAK: %d" , send_ack);
337322}
338- printf (" out sendNAk\n " );
323+ }
324+ void initRXQ (QTYPE *q){
325+ for (int i = 0 ;i < RXQSIZE; ++i){
326+ q->data [i] = 0xFF ;
327+ }
339328}
0 commit comments