2010-08-05 2 views
0

"네트워크를 통해"파일 이름 ","파일 크기 "및 filedata를 전송해야하는 응용 프로그램에서 작업하고 있습니다. 부스트를 사용하여 서버를 만들었습니다. 지금은 파일 크기와 이름을 읽습니다.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와 거의 같은 프로토콜을 사용하고 있습니다. 메타 데이터 (\ 연구 \ 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

을 안녕하세요, Gianni, 답장을 보내 주셔서 감사합니다. 이것이 데이터를 올바르게 전송합니까? 또는 모든 데이터를 청크로 보내고이 async_write()를 청크로 여러 번 호출해야합니까? – pollux

+0

이것은 모든 데이터입니다. 아무 것도 정말로 필요 없습니다. – Gianni

+0

안녕하세요, Gianni, 내일 시도하겠습니다. 제 코드가 작동 중입니다. 하지만 고마워! 그것이 그렇게 쉽게 기대하지 않았다! – pollux

관련 문제