Beispiel #1
0
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); 
    }
  }
  
}
Beispiel #2
0
//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;
}