• 基于g_soap制作的数据下载器,传输速度只有600kb 需改进


    服务端:

        

    //结构体  
    class ns_DownInfo
    {
    	char m_pBuffer[1024];
    	int m_nReadSize;
    	bool m_bEof;
    };
    
    struct ns_getDownInfoResponse {ns_DownInfo return_;};
    
    int ns__DownFile(char *pcFileName, int nPosition, struct ns_getDownInfoResponse &r);
    
    int ns__GetHelloWorld(char * &GetHelloWorldReturn);  //注册
    
    
    //server.h
    /********************************
     author: DuanYueming
     Creat: 2014/7/19
     Creat: 2014:17:52 
    
     purpose:发送文件模块
    *******************************/
    
      #include "FileInfo.h"
    #include "ns.nsmap"
    //#include <fstream>
    //
    //
    //	
    //class Server
    //{    
    //public:
    //	Server::Server(int _port=5678);
    //	~Server();
    //	int ns__SendFile(struct soap*, char *FileName, int Position, struct ns_GetFileInfo  &s);
    //	/*char *GetFileName(char *_FilePath);*/
    //	void InitSoap();
    //	
    //	
    //private:
    //	int m_TotalSize;
    //	char *m_FileName;
    //	bool m_state;
    //	int  m_port;
    //	int m_UpdataSize;
    //	struct ns__SendFile *m_SendFile;
    //	struct soap m_soap;
    //};
    
    //server.cpp
    
    // #include "Server.h"
    // using std::ifstream;
    // Server::Server(int _port)
    // {   
    // 	m_TotalSize=0;
    // 	m_FileName=NULL;
    // 	m_state=false;
    // 	m_port=_port;
    // 	m_UpdataSize=0;
    // }
    // 
    // //char* Server::GetFileName(char *_FilePath)
    // //{
    // //   m_FileName=_FilePath;
    // // /*  return _FilePath;*/
    // //}
    // 
    //  
    // void Server::InitSoap()
    // {
    // 	 soap_init(&m_soap);
    // 	 SOCKET _state = soap_bind(&m_soap,NULL,m_port,100);
    // 	 if (_state == INVALID_SOCKET)
    // 	 {
    // 		 printf("The Socket Bind Error!");
    // 			 exit(1);
    // 	 }
    // 	 printf("Socket Successful");
    // 	 for (;;)
    // 	 {
    // 		 int _accept_state = (int)soap_accept(&m_soap);
    // 		 if (_accept_state < 0)
    // 		 {
    // 			 soap_print_fault(&m_soap, stderr);
    // 			 exit(-1);
    // 		 }
    // 		 printf("Connect Successful");
    // 		 soap_serve(&m_soap);
    // 		 soap_end(&m_soap);
    // 	 }
    // 
    // }
    // int Server::ns__SendFile(struct soap*, char *FileName, int Position, struct ns_GetFileInfo &s)
    // {
    // 	
    // 	ifstream _file;
    // 	
    // 	_file.open(FileName,std::ios::in | std::ios::binary);
    // 	if (_file.is_open())
    // 	{  
    // 		_file.seekg(Position);
    // 		m_TotalSize = _file.tellg();
    // 		while (!_file.eof())
    // 		{    
    //  			_file.read(s.m_FileInfo.m_FileBuff,1024);
    //  			m_UpdataSize += _file.gcount();
    //  			printf("Sending %02d%%",(m_UpdataSize-m_TotalSize)*100);
    // 			fflush(stdout);
    // 			printf("
    ");
    // 			
    // 		}
    // 		_file.close();
    // 
    // 	}
    // 	return 0;
    // }
    // 
    
    
    //inline ns_FileInfo * soap_new_req_ns_FileInfo(struct soap *soap, char m_FileBuff[1024], int m_TotalSize, bool m_state) 
    //{ 
    //	ns_FileInfo *_p = soap_instantiate_ns_FileInfo(soap, -1, NULL, NULL, NULL);
    //if (_p) 
    //{ 
    //	_p->soap_default(soap); 
    //    _p->ns_FileInfo::m_FileBuff = m_FileBuff; 
    //    _p->ns_FileInfo::m_TotalSize = m_TotalSize;
    //    _p->ns_FileInfo::m_state = m_state;
    //} 
    //   return _p; 
    //}
    

      

    //客户端

    #include "soapStub.h"
    #include "ns.nsmap"
    #include <fstream>
    using std::ofstream;
    using std::ifstream;
    
    int GetHelloWorld(const char* server)
    {
    	struct soap str_soap;
    	int nResult = 0;
    	soap_init(&str_soap);
    	char* buff;// = new char[1024];
    	soap_call_ns__GetHelloWorld(&str_soap, server, "", buff);
    	if (str_soap.error)
    	{
    		soap_print_fault(&str_soap, stderr);
    	}
    	soap_end(&str_soap);
    	soap_done(&str_soap);
    	return 0;
    }
    
    int DownFile(const char* server)
    {
    	//从服务器读取pSourceFileName文件另存为pOldFileName文件
    	char *pSourceFileName = "D:\shrike-i386-disc1.iso", *pOldFileName = "E:\444.txt";
    	struct soap str_soap;
    	int nResult = 0;
    	soap_init(&str_soap);
    	struct ns_getDownInfoResponse rResponse;
    	soap_call_ns__DownFile(&str_soap, server, "", pSourceFileName, 0, rResponse);
    	bool bEof(false);
    	if (str_soap.error)
    	{
    		soap_print_fault(&str_soap, stderr);
    		bEof = true;
    	}
    	ofstream file;
    	if(!bEof)
    	{
    		file.open(pOldFileName, std::ios::out | std::ios::binary | std::ios::trunc);
    		if(file.is_open())
    			file.write(rResponse.return_.m_pBuffer, rResponse.return_.m_nReadSize);
    	}
    	bEof = rResponse.return_.m_bEof; 
    	int nPosition = rResponse.return_.m_nReadSize;
    	soap_end(&str_soap);
    	soap_done(&str_soap);
    
    	while(!bEof)
    	{
    		soap_call_ns__DownFile(&str_soap, server, "", pSourceFileName, nPosition, rResponse);
    		if (str_soap.error)
    		{
    			soap_print_fault(&str_soap, stderr);
    			bEof = true;
    		} 
    		else
    		{
    			if(file.is_open())
    				file.write(rResponse.return_.m_pBuffer, rResponse.return_.m_nReadSize);
    			bEof = rResponse.return_.m_bEof;
    			nPosition += rResponse.return_.m_nReadSize;
    		}
    		soap_end(&str_soap);
    		soap_done(&str_soap);
    	}
    	if(file.is_open())
    		file.close();
    	return 0;
    }
    
    int main(int argc, char * argv[])
    {
    	char *server = "http://localhost:8080";
    	GetHelloWorld(server);
    	DownFile(server);
    	return 0;
    }
    

      代码比较残缺,从坏了的硬盘弄出来的。。。当然,还是能做个例子的,具体的就不介绍了,相信有过一定编程经验的都能轻松看懂。

  • 相关阅读:
    transition
    Java自增陷阱
    不同编码格式中,字节和字符的关系
    表单重复提交
    source folder和package的区别
    @test 测试案例不能添加参数
    http协议content-type
    jdbc的缺点和mybatis的优点
    ==和equals的区别
    spring IOC和AOP
  • 原文地址:https://www.cnblogs.com/dragonmoon/p/4072520.html
Copyright © 2020-2023  润新知