Skip to content

Commit 27b4bef

Browse files
committed
Fix bug for segfault
1 parent a918e26 commit 27b4bef

File tree

2 files changed

+42
-57
lines changed

2 files changed

+42
-57
lines changed

src/receiver.cpp

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void createSocket(char* addr, char* port);
5252

5353
/* Functions declaration */
5454
static Byte* q_get(QTYPE *);
55-
static int rcvframe(int sockfd, QTYPE *q);
55+
static int rcvframe(QTYPE *q);
5656
pair<int, string> convbuf(char* c);
5757
string convRESPtostr(int res, int msgno);
5858

@@ -63,7 +63,7 @@ socklen_t addrlen = sizeof(serv_addr), clilen = sizeof(cli_addr);
6363
void *childProcess(void *threadid);
6464
void sendACK(int framenum);
6565
void sendNAK(int framenum);
66-
66+
void initRXQ(QTYPE*);
6767
// SERVER PROGRAM
6868
int main(int argc, char *argv[]){
6969
// create socket
@@ -72,7 +72,7 @@ int main(int argc, char *argv[]){
7272
/* Initialize XON/XOFF flags */
7373
send_xon = true;
7474
send_xoff = false;
75-
75+
initRXQ(rxq);
7676
/* Create child process */
7777
pthread_t child_thread;
7878
int rc = pthread_create(&child_thread, NULL, childProcess, (void *)0);
@@ -83,23 +83,22 @@ int main(int argc, char *argv[]){
8383

8484
/*** IF PARENT PROCESS ***/
8585
while(true){
86-
printf("parent thread\n");
87-
int ret = rcvframe(sockfd, rxq);
88-
printf("selesai parent\n");
86+
int ret = rcvframe(rxq);
8987
}
9088

9189
pthread_join(child_thread, NULL);
9290
pthread_exit(NULL);
9391
return 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
*/
10198
static Byte* q_get(QTYPE *q){
10299
Byte* current;
100+
puts("MASUK QGET");
101+
printf("%d\n", q->count);
103102
/* Nothing in the queue */
104103
if(!q->count) return (NULL);
105104
if(q->data[q->front] == 0xFF) return (NULL);
@@ -127,21 +126,16 @@ static Byte* q_get(QTYPE *q){
127126
return current;
128127
}
129128

130-
static int rcvframe(int sockfd, QTYPE *q){
129+
static int rcvframe(QTYPE *q){
131130
memset(recvbuf, 0, sizeof recvbuf);
132-
printf("masuk recvframe\n");
133131
int byte_recv = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*)&cli_addr, &clilen);
134-
// printf("%d\n", byte_recv);
135132
if(byte_recv < 0){ //error receiving character
136133
printf("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("");
142136
pair<int,string> M = convbuf(recvbuf);
143137
printf("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
145139
printf("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){
151145
if(M.fi <= q->rear){
152146
if(M.fi >= q->front){
153147
strncpy((char*)msg[M.fi], M.se.c_str(), M.se.length());
148+
q->data[M.fi] = M.fi;
154149
}
155150
else if(q->front > q->rear){
156151
strncpy((char*)msg[M.fi], M.se.c_str(), M.se.length());
152+
q->data[M.fi] = M.fi;
157153
}
158154
else{
159155
//bagi dua lagi, apakah ada didalem batas apa nggak, ini ditulis soalnya bisa aja dia sebenernya lanjutannya tapi udah muter
160156
if((M.fi + 1) + RXQSIZE - q->front < WINDOWSIZE){
161157
q->count = M.fi + 1 + RXQSIZE - q->front;
162158
q->rear = M.fi;
163159
strncpy((char*)msg[q->rear], M.se.c_str(), M.se.length());
160+
q->data[M.fi] = M.fi;
164161
lastrecv = q->rear;
165162
}
166163
else {
@@ -175,6 +172,7 @@ static int rcvframe(int sockfd, QTYPE *q){
175172
q->count = M.fi + 1 + RXQSIZE - q->front;
176173
q->rear = M.fi;
177174
strncpy((char*)msg[q->rear], M.se.c_str(), M.se.length());
175+
q->data[M.fi] = M.fi;
178176
lastrecv = q->rear;
179177
}
180178
}
@@ -184,6 +182,7 @@ static int rcvframe(int sockfd, QTYPE *q){
184182
q->count = M.fi - q->front + 1;
185183
q->rear = M.fi;
186184
strncpy((char*)msg[q->rear], M.se.c_str(), M.se.length());
185+
q->data[M.fi] = M.fi;
187186
lastrecv = q->rear;
188187
}
189188
}
@@ -199,9 +198,7 @@ static int rcvframe(int sockfd, QTYPE *q){
199198
}
200199
}
201200
else{
202-
printf("di recvframe\n");
203201
sendNAK(q->front);
204-
printf("di recvframe\n");
205202
}
206203
return M.fi;
207204
}
@@ -249,15 +246,11 @@ pair<int, string> convbuf(char* buf){
249246
}
250247
unsigned char t[MAXLEN << 1]; //for checksum
251248
memset(t,0,sizeof t);
252-
printf("HAHAHAHA");
253249
for(int i = 0;i < checkstr.length(); ++i){
254250
t[i] = (Byte)checkstr[i];
255-
printf(" %d", t[i]);
256251
}
257-
puts("");
252+
258253
unsigned int checksum = crc32a(t);
259-
//////////debug checksum. status : belum lewat///////////////////////
260-
printf("%u %u\n", checksum, check);
261254
if(checksum != check) return make_pair(-1, "");
262255
return res;
263256
}
@@ -266,16 +259,17 @@ string convRESPtostr(int res, int msgno){
266259
RESP R;
267260
R.res = res;
268261
R.msgno = msgno;
269-
unsigned char* uc = new unsigned char[3];
262+
unsigned char uc[3];
263+
memset(uc, 0, sizeof uc);
270264
uc[0] = R.res;
271265
uc[1] = R.msgno;
272266
R.checksum = crc32a(uc);
273-
memset(sendbuf, 0, sizeof sendbuf);
274267
string s = "";
275268
s += (char)R.res;
276269
s += (char)R.msgno;
277270
s += to_string(R.checksum);
278-
strncpy(sendbuf, s.c_str(), s.length());
271+
return s;
272+
279273
}
280274

281275
void *childProcess(void *threadid){
@@ -287,35 +281,28 @@ void *childProcess(void *threadid){
287281

288282
if(now != NULL){
289283
printf("Mengkonsumsi byte ke-%d.\n", *now);
290-
printf("numframe : %d\n", *now);
291284
sendACK(*now);
292-
printf("ack sent!\n");
293-
sleep(2);
294285
// usleep(DELAY * 10000000);
295286
*now = 0xFF;
296287
}
297288
else{
298289
// printf("ANAK PIPIN :3\n");
299290
if(rxq->count != 0){
300-
printf("di child\n");
301291
sendNAK(rxq->front);
302-
printf("before usleep\n");
303-
sleep(2);
304292
}
305293
}
294+
sleep(1);
306295
}
307296
pthread_exit(NULL);
308297
}
309298

310299
void sendACK(int framenum){
311300
string s = convRESPtostr(ACK, framenum);
312301
memset(sendbuf, 0, sizeof sendbuf);
313-
cout << s << endl;
302+
puts(s.c_str());
314303
for(int i = 0;i < s.length(); ++i){
315-
printf("done resp conv : %d\n", s[i]);
316304
sendbuf[i] = s[i];
317305
}
318-
printf("SEND ACK!\n");
319306
//kayaknya ini masih ngebug
320307
int send_ack = sendto(sockfd, sendbuf, sizeof(sendbuf), 0, (struct sockaddr*)&cli_addr, clilen);
321308
if(send_ack < 0){//error sending ACK character
@@ -329,11 +316,13 @@ void sendNAK(int framenum){
329316
for(int i = 0;i < s.length(); ++i){
330317
sendbuf[i] = s[i];
331318
}
332-
printf("SEND NAK!\n");
333319
int send_ack = sendto(sockfd, sendbuf, sizeof(sendbuf), 0, (struct sockaddr*)&cli_addr, clilen);
334-
printf("done send nak\n");
335320
if(send_ack < 0){//error sending ACK character
336321
printf("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
}

src/transmitter.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ using namespace std;
2020
//build a socket
2121
struct sockaddr_in serv_addr, cli_addr;
2222
socklen_t serv_len = sizeof(serv_addr), cli_len = sizeof(cli_addr);
23-
char receiverAddress[MAXLEN];
23+
char receiverAddress[MAXLEN + 40];
2424
int sockfd;
2525
int NAKnum = -1;
2626

@@ -35,7 +35,7 @@ bool done = false;
3535

3636
//sliding window protocol
3737
char cc[RXQSIZE][MAXLEN + 10]; //size of buffer in chunks
38-
Byte lastacked = RXQSIZE - 1, lastsent = -1, countBuf = 0;
38+
char lastacked = -1, lastsent = -1, countBuf = 0;
3939

4040
bool corruptACK(char* s);
4141
void createSocket(char* addr, char* port);
@@ -54,7 +54,6 @@ int main(int argc, char *argv[]){
5454
}
5555
createSocket(argv[1], argv[2]);
5656
initMESGB();
57-
printf("\nmesg.stx : %d ----\n", mesg.stx);
5857
initTimeOut();
5958

6059
/* Create child process for receiving data*/
@@ -77,15 +76,8 @@ int main(int argc, char *argv[]){
7776
lastsent = (lastsent + 1) % RXQSIZE;
7877
countBuf = (lastsent - lastacked);
7978
countBuf %= RXQSIZE;
80-
81-
//set dataformat to mesg
82-
printf("\nmesg.soh : %d ----\n", mesg.soh);
83-
printf("\nmesg.stx : %d ----\n", mesg.stx);
84-
printf("\nmesg.etx : %d ----\n", mesg.etx);
8579
mesg.msgno = idx % RXQSIZE;
86-
printf("\nmesg.msgno : %d ----\n", mesg.msgno);
8780
mesg.data = cc[idx % RXQSIZE];
88-
printf("\nmesg.data : %s ----\n", mesg.data);
8981
string s = convMESGBtostr(mesg);
9082

9183
memset(c_sendto, 0, sizeof c_sendto);
@@ -96,11 +88,11 @@ int main(int argc, char *argv[]){
9688
printf("Mengirim frame ke-%d: \'%s\' \n", idx, cc[lastsent]);
9789
idx++;
9890
sendto(sockfd, c_sendto, sizeof(c_sendto), 0, (struct sockaddr*)&serv_addr, serv_len);
99-
usleep(5000);
91+
usleep(500000);
10092
}
10193
else if(xoff && NAKnum == -1){ // XOFF sent, receive buffer is above minimum upperlimit
10294
printf("Menunggu XON...\n");
103-
usleep(20000);
95+
usleep(50000);
10496
}
10597
else{ //NAKnum != -1
10698
mesg.msgno = NAKnum;
@@ -114,7 +106,7 @@ int main(int argc, char *argv[]){
114106

115107
// printf("Mengirim NAK ke-%d: \'%s\' \n", NAKnum, cc[NAKnum]);
116108
sendto(sockfd, c_sendto, sizeof(c_sendto), 0, (struct sockaddr*)&serv_addr, serv_len);
117-
usleep(5000);
109+
usleep(50000);
118110
NAKnum = -1;
119111
}
120112
}
@@ -129,7 +121,8 @@ bool corruptACK(char* s){
129121
string ss = "";
130122
unsigned int checksum = 0;
131123
unsigned int real_c = 0;
132-
while(s[i] != 0){
124+
125+
while(s[i] != 0 || i < 2){
133126
if(i == 0){
134127
if(s[i] != ACK && s[i] != NAK){
135128
return true;
@@ -141,7 +134,7 @@ bool corruptACK(char* s){
141134
else if(i == 1){
142135
ss += s[i];
143136
unsigned char ta[MAXLEN + 40];
144-
memset(ta,0,sizeof ta);
137+
memset(ta, 0, sizeof ta);
145138
for(int j = 0; j < ss.length(); ++j){
146139
ta[j] = ss[j];
147140
}
@@ -173,8 +166,8 @@ void initMESGB(){
173166
}
174167
void initTimeOut(){
175168
struct timeval tv;
176-
tv.tv_sec = 0;
177-
tv.tv_usec = 200000;
169+
tv.tv_sec = 3;
170+
tv.tv_usec = 000000;
178171
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
179172
perror("Error");
180173
}
@@ -188,6 +181,7 @@ void *childProcess(void *threadid){
188181
if(rc < 0){
189182
printf("Timeout!\n");
190183
NAKnum = (lastacked + 1) % RXQSIZE;
184+
printf("NAK Timeout %d\n", NAKnum);
191185
}
192186
if(c_recvfrom[0] == XON){
193187
printf("XON diterima.\n");
@@ -225,10 +219,12 @@ string convMESGBtostr(MESGB m){
225219
ret += m.stx;
226220
ret += m.data;
227221
ret += m.etx;
228-
unsigned char t[MAXLEN << 1]; //for checksum
229-
strcpy( (char*) t, ret.c_str());
222+
unsigned char t[MAXLEN + 40]; //for checksum
223+
memset(t,0,sizeof t);
224+
for(int i = 0;i < ret.length(); ++i){
225+
t[i] = ret[i];
226+
}
230227
m.checksum = crc32a(t);
231228
ret += to_string(m.checksum);
232-
printf("Checksum: %u\n", m.checksum);
233229
return ret;
234230
}

0 commit comments

Comments
 (0)