int server_receive_files(int socket, const char* dir) { //DIR* dirptr; int dir_fd; struct server_data server_data_s; struct server_data *server_data = &server_data_s; cpytype_t filetype; int ret = -1; /*char flushbuf[512]; if ((server_data = malloc(sizeof(server_data))) == NULL) { VIR_DEBUG("malloc failed"); goto err; }*/ server_data->available = 0; server_data->i_begin = 0; if (server_send_status(socket, STATUS_ACK) < 0) goto err; filetype = server_receive_type(socket, server_data); /* if ((dirptr = opendir(dir)) == NULL) { VIR_DEBUG("failed to openddir"); goto err; } VIR_DEBUG("opened dir '%s' fd %d", dir, dirfd(dirptr)); */ if ((dir_fd = open(dir, O_DIRECTORY | O_RDONLY)) < 0) { VIR_DEBUG("failed to open dir: %s", strerror(errno)); goto err; } VIR_DEBUG("opened dir '%s' fd %d", dir, dir_fd); while (filetype != TYPE_ENDTOKEN) { if (filetype == TYPE_REG) { if (recv_reg(socket, server_data, dir_fd) < 0) goto err; } else if (filetype == TYPE_DIR) { if (recv_dir(socket, server_data, dir_fd) < 0) goto err; } else if (filetype == TYPE_LNK) { if (recv_lnk(socket, server_data, dir_fd) < 0) goto err; } else { VIR_DEBUG("received something that is not supported (i.e. not a regular file, a symlink or a folder..."); goto err; } /* if (server_send_status(socket, STATUS_ACK) < 0) { VIR_DEBUG("could not send ACK"); goto err; }*/ filetype = server_receive_type(socket, server_data); VIR_DEBUG("received type %d", filetype); } VIR_DEBUG("received end token"); ret = 0; err: // free(server_data); return ret; }
//执行接受操作 void recv_package() { int i; int ret; int package_size = 0; int message_flag = 0; char recv_sig_buf = 0; //等待连续3次sig_start for(i=0; i<3; i++) { ret = recv_time_out(cli_serial_num,&recv_sig_buf,sizeof(char)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } if(recv_sig_buf == sig_start) { recv_sig_buf = 0; } else { i = -1; recv_sig_buf = 0; } } //接收命令 ret = recv_time_out(cli_serial_num,&recv_sig_buf,sizeof(char)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } if(recv_sig_buf != CMD_RECV_MESSAGE) { fprintf(stderr,"recv %x\n",recv_sig_buf); } switch(recv_sig_buf) { case CMD_CONTACTS: fprintf(stderr,"wait recv contact\n"); //接收通讯录 recv_file("/tmp/ass/"); break; case CMD_INSERT_CONTACT: break; case CMD_DELETE_CONTACT: break; case CMD_UPDATE_CONTACT: break; case CMD_MESSAGE: //接收短信的结构体至message_pack memset(&message_pack,'\0',sizeof(message_pack_t)); fprintf(stderr,"wait recv message package_size\n"); //接收package_size若超出结构体大小。则返回;否则接收 ret = recv_time_out(cli_serial_num,(char *)&package_size,sizeof(int)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } if(package_size > sizeof(message_pack_t)) { fprintf(stderr,"package_size:%d\n",package_size); return ; } fprintf(stderr,"package_size: %d\n",package_size); ret = recv_time_out(cli_serial_num,(char *)&message_pack,package_size); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } break; case CMD_SEND_MESSAGE: break; case CMD_APPINFO: fprintf(stderr,"wait recv appinfo\n"); //接收应用信息appinfo.db3至指定路径 recv_file("/tmp/ass/"); fprintf(stderr,"wait recv appicon\n"); //接收应用图标 recv_dir("/tmp/ass/icon/"); break; case CMD_IMAGE: //接收图片信息至image_pack memset(&image_pack,'\0',sizeof(image_pack_t)); fprintf(stderr,"wait recv image package_size\n"); //接收package_size若超出结构体大小。则返回;否则接收 ret = recv_time_out(cli_serial_num,(char *)&package_size,sizeof(int)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } if(package_size > sizeof(image_pack_t)) { fprintf(stderr,"error package_size:%d\n",package_size); return ; } fprintf(stderr,"package_size: %d\n",package_size); ret = recv_time_out(cli_serial_num,(char *)&image_pack,package_size); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } //接收缩略图 fprintf(stderr,"wait recv imageThumbnail\n"); recv_dir("/tmp/ass/imageThumbnail/"); break; case CMD_AUDIO: //接收音频信息至audio_pack memset(&audio_pack,'\0',sizeof(audio_pack_t)); fprintf(stderr,"wait recv audio package_size\n"); //接收package_size若超出结构体大小。则返回;否则接收 ret = recv_time_out(cli_serial_num,(char *)&package_size,sizeof(int)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } if(package_size > sizeof(audio_pack_t)) { fprintf(stderr,"error package_size:%d\n",package_size); return ; } fprintf(stderr,"package_size: %d\n",package_size); ret = recv_time_out(cli_serial_num,(char *)&audio_pack,package_size); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } break; case CMD_VIDEO: //接收视频信息至video_pack memset(&video_pack,'\0',sizeof(video_pack_t)); fprintf(stderr,"wait recv video package_size\n"); //接收package_size若超出结构体大小。则返回;否则接收 ret = recv_time_out(cli_serial_num,(char *)&package_size,sizeof(int)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } if(package_size > sizeof(video_pack_t)) { fprintf(stderr,"error package_size:%d\n",package_size); return ; } fprintf(stderr,"package_size: %d\n",package_size); ret = recv_time_out(cli_serial_num,(char *)&video_pack,package_size); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } fprintf(stderr,"%d\n",video_pack.count); //接收缩略图 fprintf(stderr,"wait recv videoThumbnail\n"); recv_dir("/tmp/ass/videoThumbnail/"); break; case CMD_RECV_MESSAGE: //接收新短信标志 ret = recv_time_out(cli_serial_num,(char *)&message_flag,sizeof(int)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } //若未收到短信,则将信号清空 if(message_flag == 0) { //若未收到短信,则清空标志 recv_sig_buf = 0; } else { //若收到短信,则接收new_message结构体 fprintf(stderr,"wait new message\n"); memset(&new_message,'\0',sizeof(message_t)); ret = recv_time_out(cli_serial_num,(char *)&new_message,sizeof(message_t)); if(ret == -1) { fprintf(stderr,"recv error\n"); return ; } fprintf(stderr,"new message:\n%s\n%s\n%s\n",new_message.message_name,new_message.message_date,new_message.message_body); } break; default: break; } //仅允许覆盖0x00与CMD_RECV_MESSAGE if(recv_cmd_flag == 0x00 || recv_cmd_flag == CMD_RECV_MESSAGE) { pthread_mutex_lock(&recv_flag_mutex); if(recv_sig_buf != 0x00) { fprintf(stderr,"recv_flag_lock\n"); } recv_cmd_flag = recv_sig_buf; pthread_mutex_unlock(&recv_flag_mutex); if(recv_sig_buf != 0x00) { fprintf(stderr,"recv_flag_unlock\n"); } } recv_sig_buf = 0; }