void rel_read (rel_t *s) { if (send_check(s)) { packet_t out_pkt; int count = conn_input(s->c, out_pkt.data, READ_SIZE); if (count == 0) { // no input return; } else { if (count == -1) { // EOF count = 0; s->SEND_EOF = true; } // send out_pkt.cksum = 0; out_pkt.len = htons(count + 12); out_pkt.ackno = htonl(1); out_pkt.seqno = htonl(s->LSS+1); out_pkt.cksum = cksum(&out_pkt, count+12); conn_sendpkt(s->c, &out_pkt, count+12); addPktToSWindow(s, out_pkt); } } }
//process recv's command thread int processer() { command *current_com; unsigned int mode, opt; while (1) { sem_wait(&msg_empty); pthread_mutex_lock(&msg_lock); current_com = mlist.com_head; mlist.com_head = current_com->next; pthread_mutex_unlock(&msg_lock); if (current_com == NULL) { continue; } mode = GET_MODE(current_com->com_num); opt = GET_OPT(current_com->com_num); switch (mode) { case IPMSG_BR_ENTRY: send_recventry(current_com); pthread_mutex_lock(&user_lock); add_user(current_com); pthread_mutex_unlock(&user_lock); free(current_com); break; case IPMSG_BR_EXIT: pthread_mutex_lock(&user_lock); del_user(current_com); pthread_mutex_unlock(&user_lock); free(current_com); break; case IPMSG_ANSENTRY: pthread_mutex_lock(&user_lock); add_user(current_com); pthread_mutex_unlock(&user_lock); free(current_com); break; case IPMSG_SENDMSG: if (opt & IPMSG_SENDCHECKOPT) { send_check(current_com); } if (opt & IPMSG_FILEATTACHOPT) { printf("IN PRO SENDMSG: receive file.\n"); recv_files(current_com); }else { putout_msg(current_com); free(current_com); } break; case IPMSG_RECVMSG: free(current_com); break; case IPMSG_GETFILEDATA: free(current_com); break; case IPMSG_GETDIRFILES: free(current_com); break; case IPMSG_RELEASEFILES: free(current_com); break; default: free(current_com); break; } } return 0; }