ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

Boost.Asio c++ ÍøÂç±à³Ì·­Ò루14£©(Ò»)
2015-07-20 17:29:05 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:10´Î
Tags£ºBoost.Asio ÍøÂç±à³Ì ·­Òë
±£³Ö»î¶¯ ¼ÙÈ磬ÄãÐèÒª×öÏÂÃæµÄ²Ù×÷£º io_service service; ip::tcp::socket sock(service); char buff[512]; ... read(sock, buffer(buff)); ÔÚÕâ¸öÀý×ÓÖУ¬sockºÍbuffµÄ´æÔÚʱ¼ä¶¼±ØÐë±Èread()µ÷ÓõÄʱ¼äÒª³¤¡£Ò²¾ÍÊÇ˵£¬ÔÚµ÷ÓÃread()·µ»ØÖ®Ç°£¬ËüÃǶ¼±ØÐëÓÐЧ¡£Õâ¾ÍÊÇÄãÆÚÍûµÄ£»Äã´«¸øÒ»¸ö·½·¨µÄËùÓвÎÊýÔÚ²ÎÊýÄÚ²¿¶¼±ØÐëÓÐЧ¡£µ±ÎÒÃDzÉÓÃÒì²½·½Ê½Ê±£¬ÊÂÇé»á±äµÃÔ½¸´ÔÓ¡£ io_service service; ip::tcp::socket sock(service); char buff[512]; void on_read(const boost::system::error_code &, size_t) {} ... async_read(sock, buffer(buff), on_read); ÔÚÕâ¸öÀý×ÓÖУ¬sockºÍbuffµÄ´æÔÚʱ¼ä¶¼±ØÐë±Èread()²Ù×÷±¾Éíʱ¼äÒª³¤£¬µ«ÊÇread²Ù×÷µÄʱ¼äÎÒÃÇÊDz»ÖªµÀµÄ£¬ÒòΪËüÊÇÒì²½µÄ¡£ µ±Ê¹ÓÃsocket»º³åÇøµÄʱºò£¬Äã»áÓÐÒ»¸öbufferʵÀýÔÚÒì²½µ÷ÓÃʱһֱ´æÔÚ£¨Ê¹ÓÃboost::shared_array<>£©¡£ÔÚÕâÀÎÒÃÇ¿ÉÒÔʹÓÃͬÑùµÄ·½Ê½£¬Í¨¹ý´´½¨Ò»¸öÀಢÔÚÆäÄÚ²¿¹ÜÀísocketºÍËüµÄ¶Áд»º³åÇø¡£È»ºó£¬¶ÔÓÚËùÓеÄÒì²½²Ù×÷£¬ÎһᴫµÝÒ»¸ö°üº¬ÖÇÄÜÖ¸ÕëµÄboost::bind·Âº¯Êý£º
using namespace boost::asio;
   io_service service;
   struct connection : boost::enable_shared_from_this
  
    {

  
       typedef boost::system::error_code error_code;
       typedef boost::shared_ptr
  
    ptr;
       connection() : sock_(service), started_(true) {}
       void start(ip::tcp::endpoint ep) {

  
           sock_.async_connect(ep,
                 boost::bind(&connection::on_connect, shared_from_this(),

_1)); }

       void stop() {
           if ( !started_) return;
           started_ = false;
           sock_.close();

}

       bool started() { return started_; }
   private:
       void on_connect(const error_code & err) {
           // here you decide what to do with the connection: read or
   write
           if ( !err)      do_read();
           else            stop();
       }
       void on_read(const error_code & err, size_t bytes) {
           if ( !started() ) return;
           std::string msg(read_buffer_, bytes);
page64image11240
if ( msg == "can_login")
else if ( msg.find("data ") == 0)
else if ( msg == "login_fail")
do_write("access_data");
process_data(msg);
stop();
}
void on_write(const error_code & err, size_t bytes) {

do_read(); }

void do_read() {
           sock_.async_read_some(buffer(read_buffer_),
                 boost::bind(&connection::on_read, shared_from_this(),

_1, _2)); }

       void do_write(const std::string & msg) {
           if ( !started() ) return;
           // note: in case you want to send several messages before
           //       doing another async_read, you'll need several write
   buffers!
           std::copy(msg.begin(), msg.end(), write_buffer_);
           sock_.async_write_some(buffer(write_buffer_, msg.size()),
                 boost::bind(&connection::on_write, shared_from_this(),

_1, _2)); }

       void process_data(const std::string & msg) {
           // process what comes from server, and then perform another

write }

   private:
       ip::tcp::socket sock_;
       enum { max_msg = 1024 };
       char read_buffer_[max_msg];
       char write_buffer_[max_msg];
       bool started_;

};

   int main(int argc, char* argv[]) {
       ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"),
   8001);
       connection::ptr(new connection)->start(ep);

}

ÔÚËùÓÐÒì²½µ÷ÓÃÖУ¬ÎÒÃÇ´«µÝÒ»¸öboost::bind·Âº¯Êýµ±×÷²ÎÊý¡£Õâ¸ö·Âº¯ÊýÄÚ²¿°üº¬ÁËÒ»¸öÖÇÄÜÖ¸Õ룬ָÏòconnectionʵÀý¡£Ö»ÒªÓÐÒ»¸öÒì²½²Ù×÷µÈ´ýʱ£¬Boost.Asio»á±£´æboost::bind·Âº¯ÊýµÄ¿½±´£¬Õâ¸ö¿½±´±£´æÁËÖ¸ÏòÁ¬½ÓʵÀýµÄÒ»¸öÖÇÄÜÖ¸Õ룬´Ó¶ø±£Ö¤connectionʵÀý±£³Ö»î¶¯¡£ÎÊÌâ½â¾ö£¡

µ±È»£¬connectionÀà½ö½öÊÇÒ»¸öskeletonÀࣻÄãÐèÒª¸ù¾ÝÄãµÄÐèÇó¶ÔËü½øÐе÷Õû£¨Ëü¿´ÆðÀ´»áºÍ·þÎñ¶ËµÄÇé¿öÏ൱²»Í¬£©¡£

ÄãÐèҪעÒâ´´½¨Ò»¸öеÄÁ¬½ÓÊÇÏ൱¼òµ¥µÄ£ºconnection::ptr(new connection)- >start(ep)¡£Õâ¸ö·½·¨Æô¶¯Á˵½·þÎñ¶ËµÄ£¨Òì²½£©Á¬½Ó¡£µ±ÄãÐèÒª¹Ø±ÕÕâ¸öÁ¬½Óʱ£¬µ÷ÓÃstop()¡£

µ±ÊµÀý±»Æô¶¯Ê±£¨start()£©£¬Ëü½«»áµÈ´ý±»Á¬½Ó¡£µ±Á¬½Ó·¢Éúʱ¡£on_connect()±»µ÷Óá£Èç¹ûûÓдíÎó·¢Éú£¬ËüÆô¶¯Ò»¸öread²Ù×÷£¨do_read()£©¡£µ±read²Ù×÷½áÊøÊ±£¬Äã½âÎöÕâ¸öÏûÏ¢£»ÄãÓ¦ÓõÄon_read()¿´ÆðÀ´»á¸÷ÖÖ¸÷Ñù¡£µ±Äãд»ØÒ»¸öÏûϢʱ£¬ÄãÐèÒª°ÑËü¿½±´µ½»º³åÇø£¬È»ºóÏñÎÒÔÚdo_write()·½·¨ÖÐËù×öµÄÒ»Ñù½«Æä·¢ËͳöÈ¥£¬ÒòΪÔÙÒ»´Î£¬Õâ¸ö»º³åÇøÐèÒªÔÚÕâ¸öÒ첽д²Ù×÷ÖÐÒ»Ö±´æ»î¡£×îºóÐèҪעÒâµÄÒ»µã¨D¨Dµ±Ð´»ØÊ±£¬ÄãÐèÒªÖ¸¶¨Ð´ÈëµÄÊýÁ¿£¬·ñÔò£¬Õû¸ö»º³åÇø¶¼»á±»·¢ËͳöÈ¥¡£

×ܽá

ÍøÂçapiʵ¼ÊÉÏÒª´óµÃ¶à£¬Õâ¸öÕ½ÚÖ»ÊÇÒ»¸ö²Î¿¼£¬µ±ÄãÔÚʵÏÖÄã×Ô¼ºµÄÍøÂçÓ¦ÓÃʱ£¬ÄãÐèÒª»ØÀ´²é¿´¡£

Boost.AsioʵÏÖÁ˶˵ãµÄ¸ÅÄÄã¿ÉÒÔÈÏΪÊÇIPºÍ¶Ë¿Ú¡£Èç¹ûÄã²»ÖªµÀ׼ȷµÄIP£¬Äã¿ÉÒÔʹÓÃresolver¶ÔÏó½«Ö÷»úÃû£¬ÀýÈçwww.yahoo.comת»»ÎªÒ»¸ö»ò¶à¸öI

Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºHDU 4802-GPA£¨Ë®£© ÏÂһƪ£ºPOJ3061 Subsequence(¶þ·Öǰ׺ºÍ..

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Spring Boot Java£º (2025-12-26 16:20:19)
¡¤Spring Boot¤ÇHello (2025-12-26 16:20:15)
¡¤Spring ¤Î»ù±¾¤«¤éŒ (2025-12-26 16:20:12)
¡¤C++Ä£°å (template) (2025-12-26 15:49:49)
¡¤C ÓïÑÔÖÐÄ£°åµÄ¼¸ÖÖ (2025-12-26 15:49:47)