void rel_recvpkt (rel_t *r, packet_t *pkt, size_t n) { //fprintf(stderr, "\n******************receive!********************\n"); if (!check_valid(pkt, n)) return; //fprintf(stderr, "\n******************pass check!********************\n"); int i = 0; if (ntohs(pkt->len) == 8) { // sender side // receive ack //fprintf(stderr, "\n******************Receive Ack ack:%d, LAR:%d!********************\n", ntohl(pkt->ackno), r->LAR); if (ntohl(pkt->ackno) > r->LAR) { for (i=r->LAR; i<ntohl(pkt->ackno); i++) { r->sendState[i% r->window_size] = 1; // got ack } r->LAR = ntohl(pkt->ackno) - 1; if (r->SEND_EOF) { // receive ack of eof r->EOF_ACKED = true; } rel_read(r); } } else if (ntohs(pkt->len) >= 12) { // receiver side if (recv_check(r, pkt)) { if (ntohl(pkt->seqno) == r->LSR+1) { // right seqno, output buffer and change LSR, LAS and recvState if (ntohs(pkt->len) == 12) { // receive EOF r->RECV_EOF = true; } addPktToRWindow(r, pkt); // add to buffer first rel_output(r); } else if (ntohl(pkt->seqno) <= r->LSR) { // old seqno, send current ack send_ack(r); } else { addPktToRWindow(r, pkt); // add to buffer } } else { send_ack(r); } } }
void recvs2vector (char *snd, char *recvs, vector < string > &vec) { vec.clear (); char buffer[TO_MAIL_ADDR_SIZE] = { 0 }; int j = 0; char *p = recvs; for (unsigned int i = 0; i <= strlen (recvs); i++) { if ((char) p[i] == RCPT_TOK || i == strlen (recvs)) { buffer[j] = '\0'; if (buffer != NULL) { if (true == recv_check (buffer)) { if (0 != same_domain_check (snd, buffer)) { if (buffer[0] != '\0') vec.push_back (string (buffer)); } } } memset (&buffer, 0, TO_MAIL_ADDR_SIZE); j = 0; } else if (i < strlen (recvs)) { buffer[j] = p[i]; j++; } } }