2010-08-05 21 views
0

我正在研究一个应用程序,我需要通过网络发送“文件名”,“文件大小”和场景。我创建了一个使用boost的服务器,现在读入文件大小和名称。C++,boost:如何通过网络填充缓冲区并传输(图像)文件数据?

我想知道如何用文件数据填充缓冲区(如有必要)以及如何将其传输到服务器。

这是我现在得到:

#ifndef OFXFILETRANSFERSENDH 
#define OFXFILETRANSFERSENDH 

#undef check // necessary to get Boost running on Mac 

#include <vector> 
#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/shared_ptr.hpp> 
#include <boost/enable_shared_from_this.hpp> 

#include "ofxFileTransferConnection.h" 
using boost::asio::ip::tcp; 
class ofxFileTransferSend : public boost::enable_shared_from_this<connection> { 
public: 
    typedef boost::shared_ptr<ofxFileTransferSend> pointer; 
    static pointer create(
         boost::asio::io_service& rIOService 
         ,std::string sServer 
         ,const char* sPort) 
    { 
     return pointer(new ofxFileTransferSend(rIOService,sServer, sPort)); 
    } 


private: 
    //-------------------------------------------------------------- 
    ofxFileTransferSend(
        boost::asio::io_service &rIOService 
        ,const std::string sServer 
        ,const char* sPort 
    ) 
     :port(sPort) 
     ,socket_(rIOService) 
     ,resolver_(rIOService) 
    { 

     tcp::resolver::query query(sServer, sPort); 
     resolver_.async_resolve(
          query 
          ,boost::bind(
            &ofxFileTransferSend::handleResolve 
            ,this 
            ,boost::asio::placeholders::error 
            ,boost::asio::placeholders::iterator 
          ) 
     ); 
    } 


    //-------------------------------------------------------------- 
    void handleResolve(
     const boost::system::error_code &rError 
     ,tcp::resolver::iterator oEndPointIterator 
    ) 
    { 
     if (!rError) { 
      tcp::endpoint end_point = *oEndPointIterator; 
      socket_.async_connect(
           end_point 
           ,boost::bind(
            &ofxFileTransferSend::handleConnect 
            ,this 
            ,boost::asio::placeholders::error 
            ,++oEndPointIterator 
           ) 
      ); 
     } 
     else { 
      std::cout << "Error while resolving server: " << std::endl; 
     } 
    } 

    //-------------------------------------------------------------- 
    void handleConnect(
     const boost::system::error_code &rError 
     ,tcp::resolver::iterator rOEndPointIterator 
    ) 
    { 
     if(!rError) { 
      std::cout << "Connected to remote server!" << std::endl; 
      std::size_t size = 1235; 
      std::ostream send_data_stream(&send_data); 
      send_data_stream << "filename.jpg" << "\r\n"; 
      send_data_stream << size << "\r\n"; 

      boost::asio::async_write(
          socket_ 
          ,send_data 
          ,boost::bind(
           &ofxFileTransferSend::handleSendFileInfo 
           ,this 
           ,boost::asio::placeholders::error 
          ) 
      ); 
     } 
     else { 
      // @todo on failure retry! 
      std::cout << "Error connecting to ofxFileTransferServer:" << rError.message()<< std::endl; 
     } 
    } 


    //-------------------------------------------------------------- 
    void handleSendFileInfo(
     const boost::system::error_code &rError 
    ) 
    { 
     if(!rError) { 
      cout << "okay nice, send file data done!\n"; 
     } 
     else { 
      std::cout << "Error sending file info: " << rError.message() << std::endl; 
     } 
    } 

    tcp::resolver resolver_; 
    tcp::socket socket_; 
    boost::asio::streambuf send_data; 
    const char* port; 
}; 
#endif 

回答

1

如何只倾销电线上的文件吗? HTTP就是这么做的。事实上,我发现你使用的协议几乎与HTTP相同。将所有元数据以明文形式第一(名称,大小等),放在一个空行作为元数据(\ r \ n)的终止,现在你需要的是转储文件本身:

void handleSendFileInfo(
    const boost::system::error_code &rError 
) 
{ 
    if(!rError) { 
     std::ofstream fileData(fileName); 

     boost::asio::async_write(
         socket_ 
         ,fileData 
         ,boost::bind(
          &ofxFileTransferSend::handleSendFileData 
          ,this 
          ,boost::asio::placeholders::error 
         ) 
     ); 
    } 
    else { 
     std::cout << "Error sending file info: " << rError.message() << std::endl; 
    } 
} 
+0

嗨詹尼,非常感谢您的回复!这会正确发送-all-数据吗?或者是所有的数据都是以块的形式发送的,我是否需要使用块多次调用这个async_write()? – pollux 2010-08-05 18:26:26

+0

这应该是所有的数据。不需要其他任何东西。 – Gianni 2010-08-05 19:12:57

+0

嗨詹尼,我明天去试试..我的代码在工作。但非常感谢!没想到它那么容易! – pollux 2010-08-05 19:58:13

相关问题