void callback_init(){ frame_header_init(); window_colorbuttons_init(); window_init("unnamed show"); frame_update_current(color_button); frame_copy(); }
void send_thread(void *args) { transfer_session *session; file_desc *f_desc; file_block_desc *b_desc; file_frame_data *file_frame; frame_index *f_index; frame_header *f_header; block_sent_frame bs; int qid; q_msg f_msg; int err; int frame_len = 0, len = 0, blk_count = 0; unsigned short b_index = 0; char buf_send[2061]; #if DEBUG char test[10]; FILE *fp; fp = fopen("receive.txt", "w"); #endif struct timeval start; struct timeval end; float time_used; char started = 0; int send_count = 0; int ret_val = 0; session = (transfer_session *)args; f_desc = session->f_desc; blk_count = f_desc->block_count; frame_block_sent_init(&bs); if((qid = session->data_qid) < 0) { printf("msg q error"); return; } frame_header_init(FRAME_TYPE_DATA, FRAME_DATA_MONITOR, &f_header); for(;;) { if (session->state != STATE_TRANSFER) { /* free the packages in the queue */ while(recv_msg_q(qid, &f_msg, sizeof(q_msg),\ MSG_TYPE_FILE_FRAME, IPC_NOWAIT) >= 0) { file_frame = (file_frame_data *)(f_msg.msg_buf.data); t_free(file_frame); } //t_free(f_header); //return; sleep(1); continue; } /* get frame from msg q */ if ((err = recv_msg_q(qid, &f_msg, sizeof(q_msg),\ MSG_TYPE_FILE_FRAME, IPC_NOWAIT)) < 0) { /* no msg in the queue, assum sending finished */ if(started) { gettimeofday(&end,NULL); time_used = (end.tv_sec - start.tv_sec) * 1000000\ + (end.tv_usec - start.tv_usec); time_used /= 1000000; printf("send_time_used = %f s\n", time_used); printf("send_frame_count = %d \n", send_count); send_count = 0; started = 0; } sleep(1); continue; } if(0 == started) { gettimeofday(&start, NULL); started = 1; } file_frame = (file_frame_data *)(f_msg.msg_buf.data); b_index = file_frame->block_index; /* encapusulate frame */ file_frame->file_id = HTONS(file_frame->file_id); file_frame->block_index = HTONS(file_frame->block_index); file_frame->frame_index = HTONS(file_frame->frame_index); //printf("send data block:%d, frame:%d\n", HTONS(file_frame->block_index), HTONS(file_frame->frame_index)); frame_len = frame_build(f_header, file_frame, sizeof(file_frame_data), buf_send); if(f_msg.msg_buf.data_len < FILE_FRAME_SIZE) { ((frame_header *)buf_send)->length = HTONS(f_msg.msg_buf.data_len + 11); frame_crc_gen((frame_header *)buf_send, (unsigned char *)buf_send + 6,\ f_msg.msg_buf.data_len + 6); } /* send file data frame */ ret_val = send_file_data(session, buf_send, f_msg.msg_buf.data_len + 13); if(ret_val < 0) { printf("return value:%d.\n", ret_val); perror("send to!"); } send_count++; if(!f_desc->frame_remain) { t_free(file_frame); continue; } f_desc->frame_remain[b_index - 1]--; if(f_desc->frame_remain[b_index - 1] == 0) { bs.file_id = HTONS(f_desc->file_id); bs.block_index = file_frame->block_index; frame_crc_gen(&(bs.f_header), (unsigned char*)(&bs.file_id), 4); if ((len = send(session->fd, (char *)(&bs), sizeof(block_sent_frame), 0))\ != sizeof(block_sent_frame)) { printf("send socket finished failed.\n"); session->state = STATE_CONN_LOST; t_free(file_frame); continue; } printf("block:%d has send completed.\n", HTONS(bs.block_index)); /* if all count have been sent, tansfer finished */ //blk_count--; //if(blk_count == 0) // session->state = STATE_TRANSFER_FIN; } /* free the data after send */ t_free(file_frame); } t_free(f_header); }