Boost asio学習ノートの二——ネットプログラミング
13864 ワード
ブックライブラリの中のネットワークプログラミングの例は複雑で、よく分かりません。だから、インターネットで簡単な例を探しました。URLは以下の通りですhttp://blog.chinaunix.net/u3/93184/showart_186119.1 htmlは修正されましたので、実行できます。
サーバコード:
Servier.cpp
//async ture adはクライアントと同じですか?それともhandle ture関数に入れません。もし問題点が見つかったら、教えてください。ありがとうございます。
if(error){musocket.close()}
}void handle_ture(const book:system::errorucode&error){
if(!error){std::cout:}prvate:tcp:socket musocket;char data_[maxulen];
class serverap{typedef bootst:sharredup<clientSession>sessionupt;public:serverap(bootst:asio:iouservice& ioservice、tcesp:endpoint&endpoint):msuosososviptiovice(proproproproproproprocecececececeproproproproproproproproprocececececececececese、SeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeService);acceptoru.async(newusession->socket()、book:bind(&serverAppp::handleeudcocococococpt,this,bootst:asio::plceholders::error,newgggsion))~serverap(){prvate:void handle uudcocococococptt(const bost:sysstem:sstem:errorstem:errororproproproscscscscscem:::::::::::::::::errorrrproststststscscscscscscscscscscscscscscscscscececececectrtrtrtrtrtrtrtrtrtrtrenenenenenenenenendedededededeendl;//各クライアントに対するデータ処理session->startを実現する()これでsession類を封封鎖する理由がわかるでしょう。各sessionはクライアントのsessionupttr newwusession(new clientSession);acceptoru.asynicuuucuuacccompept(newwusession->socket(boot: boot: bost:bust:bust:bibipartaphacacacacacacacacacacaccedededededededentenenenenenenenendedededededededededededededededededededededentaaaphphphasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasas)prvate:bootst:asio:iouservice&muioservice;tcp:acceptor acceptor_;;;;;;
ポイントメール(int argc、char*argv[]){bootst::asio:iouservice mIoServiceショートポートポート=8100/argv[1]*/////私達が使っているのはinet4 tcp::endpoint endPoint(tcp:v 4(point 4)/popopopoint)/popoint/point)/point/point/point(tcp:v 4(tcp:v 4(tcp:v 4(tcp:v 4(point)/point)/point)/popopoint)/point/point)/point/point/point/oService.run();return 0;
クライアントコード:
/**サーバーから送られてきた情報を読み取ります。*ここはおかしいです。async ture adを使うと、ハンドルフィールド関数に入ることができません。
//これで循環読み取りが可能になります。while(1)/もちろん、ここに来て、インターネットをしたことがある友達はかなり熟知しているはずです。いくつかのロジックは自分で拡張できます。/チャットルームを作りたい友達はマルチスレッドでsockett.asynce(boot:asio:buffer):(&client::handlegurad,this,boots::asio:placceholders::error));else{socket.close()}}void handle write(const book:sysstem:errom:error){
prvate:tcp:socket socket;char get Buffer[1024];
int main(intargc,char*argv[]){/if(argc!=3)//{/std::cerr<"Usage:chatuclient""////// return 1;//}
サーバコード:
Servier.cpp
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <iostream>
using boost::asio::ip::tcp;
#define max_len 1024
class clientSession:public bootst:enable_shared_from「clientSession」{public:clientSession(bootst:asio:ioiouservice& ioservice):m(usococket){memset(data_,\0',sizof(datat)))))~clientSesisisisisisisisisition(sockt))):{sottttket:(sockt)))))))):{sockt:(sockt:(cacacacacattttttcacacacacacacacat))))))))))))))))))))):(socacacacacacacacacatttttttttmusocket,book:asio:buffer(「link success ed!」),boot:bind(&clientSession::handle write,sharefrom_this()、book::asio:placceholders::error);//async ture adはクライアントと同じですか?それともhandle ture関数に入れません。もし問題点が見つかったら、教えてください。ありがとうございます。
// -- ,boost::asio::async_read(...) ,
// ioservice
.run()
,read 。
//boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),
// boost::bind(&clientSession::handle_read,shared_from_this(),
// boost::asio::placeholders::error));
/maxuulenは小さい数字に変えられます。asyncuradusomeは未収のデータmusocket.asyncheadusomeを連続的に受信できることが分かります。bost:bind(&clientSesisision:handeshafladshsheflasheflasheeeflashaaaafrom):buffer:buffer(datata,maxcucucucucucuulen),bost:bust:bind(&clientSesintSesisisintSesisisisisisision:bind):bind(&clientSesintSesisisisisisisisisisisisisisisisisisisisisisision:handndwrite(const book:system:errorucode&error){if(error){musocket.close()}
}void handle_ture(const book:system::errorucode&error){
if(!error){std::cout:}prvate:tcp:socket musocket;char data_[maxulen];
class serverap{typedef bootst:sharredup<clientSession>sessionupt;public:serverap(bootst:asio:iouservice& ioservice、tcesp:endpoint&endpoint):msuosososviptiovice(proproproproproproprocecececececeproproproproproproproproprocececececececececese、SeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeSeService);acceptoru.async(newusession->socket()、book:bind(&serverAppp::handleeudcocococococpt,this,bootst:asio::plceholders::error,newgggsion))~serverap(){prvate:void handle uudcocococococptt(const bost:sysstem:sstem:errorstem:errororproproproscscscscscem:::::::::::::::::errorrrproststststscscscscscscscscscscscscscscscscscececececectrtrtrtrtrtrtrtrtrtrtrenenenenenenenenendedededededeendl;//各クライアントに対するデータ処理session->startを実現する()これでsession類を封封鎖する理由がわかるでしょう。各sessionはクライアントのsessionupttr newwusession(new clientSession);acceptoru.asynicuuucuuacccompept(newwusession->socket(boot: boot: bost:bust:bust:bibipartaphacacacacacacacacacacaccedededededededentenenenenenenenendedededededededededededededededededededededentaaaphphphasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasas)prvate:bootst:asio:iouservice&muioservice;tcp:acceptor acceptor_;;;;;;
ポイントメール(int argc、char*argv[]){bootst::asio:iouservice mIoServiceショートポートポート=8100/argv[1]*/////私達が使っているのはinet4 tcp::endpoint endPoint(tcp:v 4(point 4)/popopopoint)/popoint/point)/point/point/point(tcp:v 4(tcp:v 4(tcp:v 4(tcp:v 4(point)/point)/point)/popopoint)/point/point)/point/point/point/oService.run();return 0;
クライアントコード:
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
using boost::asio::ip::tcp;
classise client{public:client(bootst:asio::iouservice& iouservice,tcp::endpoint&endpoint):socket/ここでsocketを具体化しました。r);memset(get Buffer、\\0'、1024);~client(){}prvate:void handleuconnect(const book:system:error&error){if(!error)}{/続けざまに、サービス端末に情報bootsを送信します。:async_uwrite(socket、boott:asio:buffer:buffer(「hello、server!」)、booter:clasehand:classite:/**サーバーから送られてきた情報を読み取ります。*ここはおかしいです。async ture adを使うと、ハンドルフィールド関数に入ることができません。
// -- ,boost::asio::async_read(...) ,
// ioservice
.run()
,read 。
//boost::asio::async_read(socket,
// boost::asio::buffer(getBuffer,1024),
// boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
// );
socket.async_read_some(boost::asio::buffer(getBuffer,1024),
boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
);
}else{sockete.close()}void handlemure(const book:sysstem::errorucode&error){if(!error){std:cout<get Buffer>>endl;/bootst:asio:asit:ynic/soure book:asio:buffer(get Buffer,1024)// book:bind(&client::handlegaurad,this,bootst:asio:placholders::error)// ); //これで循環読み取りが可能になります。while(1)/もちろん、ここに来て、インターネットをしたことがある友達はかなり熟知しているはずです。いくつかのロジックは自分で拡張できます。/チャットルームを作りたい友達はマルチスレッドでsockett.asynce(boot:asio:buffer):(&client::handlegurad,this,boots::asio:placceholders::error));else{socket.close()}}void handle write(const book:sysstem:errom:error){
prvate:tcp:socket socket;char get Buffer[1024];
int main(intargc,char*argv[]){/if(argc!=3)//{/std::cerr<"Usage:chatuclient
// IO_SERVICE ,
// socket
boost::asio::io_service io_service;
//
// sockaddr_in, IP PORT
tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string("192.168.1.119"/*argv[1]*/),8100/*argv[2]*/);
// socket sockaddr_in , , CONNECT
// , ,
boost::shared_ptr<client> client_ptr(new client(io_service,endpoint));
//
io_service.run();
return 0;
}
192.168.119を修正して127..0.1で、その後先にserverを運行して、更にclientを運行して、すべてok.