예제 #1
0
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;
}
예제 #2
0
//执行接受操作
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;
}