日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Boost asio学习笔记之二—— 网络编程

發(fā)布時(shí)間:2024/4/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost asio学习笔记之二—— 网络编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

boost庫中的網(wǎng)絡(luò)編程的例子比較復(fù)雜,不太好理解,所以,從網(wǎng)上找了一個(gè)簡單點(diǎn)的例子。網(wǎng)址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.html.經(jīng)過修改,可以運(yùn)行。

服務(wù)器代碼:


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 boost::enable_shared_from_this<clientSession>
{
public:
clientSession(boost::asio::io_service& ioservice)
:m_socket(ioservice)
{
memset(data_,‘\0′,sizeof(data_));
}
~clientSession()
{}
tcp::socket& socket()
{
return m_socket;
}
void start()
{
boost::asio::async_write(m_socket,
boost::asio::buffer(“l(fā)ink successed!”),
boost::bind(&clientSession::handle_write,shared_from_this(),
boost::asio::placeholders::error));

/*async_read跟客戶端一樣,還是不能進(jìn)入handle_read函數(shù),如果你能找到問題所在,請告訴我,謝謝*/

// --已經(jīng)解決,boost::asio::async_read(...)讀取的字節(jié)長度不能大于數(shù)據(jù)流的長度,否則就會進(jìn)入

// ioservice.run()線程等待,read后面的就不執(zhí)行了。
//boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

//???????? boost::bind(&clientSession::handle_read,shared_from_this(),

//???????? boost::asio::placeholders::error));

//max_len可以換成較小的數(shù)字,就會發(fā)現(xiàn)async_read_some可以連續(xù)接收未收完的數(shù)據(jù)

m_socket.async_read_some(boost::asio::buffer(data_,max_len),
boost::bind(&clientSession::handle_read,shared_from_this(),
boost::asio::placeholders::error));
}
private:
void handle_write(const boost::system::error_code& error)
{

if(error)
{
m_socket.close();
}

}
void handle_read(const boost::system::error_code& error)
{

if(!error)
{
std::cout << data_ << std::endl;
//boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

//???? boost::bind(&clientSession::handle_read,shared_from_this(),

//???? boost::asio::placeholders::error));

m_socket.async_read_some(boost::asio::buffer(data_,max_len),
boost::bind(&clientSession::handle_read,shared_from_this(),
boost::asio::placeholders::error));
}
else
{
m_socket.close();
}

}
private:
tcp::socket m_socket;
char data_[max_len];
};

class serverApp
{
typedef boost::shared_ptr<clientSession> session_ptr;
public:
serverApp(boost::asio::io_service& ioservice,tcp::endpoint& endpoint)
:m_ioservice(ioservice),
acceptor_(ioservice,endpoint)
{
session_ptr new_session(new clientSession(ioservice));
acceptor_.async_accept(new_session->socket(),
boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
new_session));
}
~serverApp()
{
}
private:
void handle_accept(const boost::system::error_code& error,session_ptr& session)
{
if(!error)
{
std::cout << “get a new client!” << std::endl;
//實(shí)現(xiàn)對每個(gè)客戶端的數(shù)據(jù)處理

session->start();
//在這就應(yīng)該看出為什么要封session類了吧,每一個(gè)session就是一個(gè)客戶端

session_ptr new_session(new clientSession(m_ioservice));
acceptor_.async_accept(new_session->socket(),
boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
new_session));
}
}
private:
boost::asio::io_service& m_ioservice;
tcp::acceptor acceptor_;
};

int main(int argc , char* argv[])
{
boost::asio::io_service myIoService;
short port = 8100/*argv[1]*/;
//我們用的是inet4

tcp::endpoint endPoint(tcp::v4(),port);
//終端(可以看作sockaddr_in)完成后,就要accept了

serverApp sa(myIoService,endPoint);
//數(shù)據(jù)收發(fā)邏輯

myIoService.run();
return 0;
}

客戶端代碼:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
using boost::asio::ip::tcp;

class client
{
public:
client(boost::asio::io_service& io_service,tcp::endpoint& endpoint)
: socket(io_service)//這里就把socket實(shí)例化了
{
//連接服務(wù)端 connect
socket.async_connect(endpoint,
boost::bind(&client::handle_connect,this,boost::asio::placeholders::error)
);
memset(getBuffer,‘\0′,1024);
}
~client()
{}
private:
void handle_connect(const boost::system::error_code& error)
{
if(!error)
{
//一連上,就向服務(wù)端發(fā)送信息
boost::asio::async_write(socket,boost::asio::buffer(“hello,server!”),
boost::bind(&client::handle_write,this,boost::asio::placeholders::error));

/**讀取服務(wù)端發(fā)下來的信息
*這里很奇怪,用async_read根本就不能進(jìn)入handle_read函數(shù)
**/

// --已經(jīng)解決,boost::asio::async_read(...)讀取的字節(jié)長度不能大于數(shù)據(jù)流的長度,否則就會進(jìn)入

// ioservice.run()線程等待,read后面的就不執(zhí)行了。

//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
{
socket.close();
}
}
void handle_read(const boost::system::error_code& error)
{
if(!error)
{
std::cout << getBuffer << std::endl;
//boost::asio::async_read(socket,
//???????? boost::asio::buffer(getBuffer,1024),
//???????? boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
//????????);

//這樣就可以實(shí)現(xiàn)循環(huán)讀取了,相當(dāng)于while(1)
//當(dāng)然,到了這里,做過網(wǎng)絡(luò)的朋友就應(yīng)該相當(dāng)熟悉了,一些邏輯就可以自行擴(kuò)展了
//想做聊天室的朋友可以用多線程來實(shí)現(xiàn)
socket.async_read_some(
boost::asio::buffer(getBuffer,1024),
boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
);
}
else
{
socket.close();
}
}
void handle_write(const boost::system::error_code& error)
{
}

private:
tcp::socket socket;
char getBuffer[1024];
};

int main(int argc,char* argv[])
{
//if(argc != 3)
//{
// std::cerr << “Usage: chat_client <host> <port>\n”;
// ?? return 1;
//}

//我覺IO_SERVICE是一個(gè)基本性的接口,基本上通常用到的類實(shí)例都需要通過它來構(gòu)造
//功能我們可以看似socket
boost::asio::io_service io_service;
//這個(gè)終端就是服務(wù)器
//它的定義就可以看作時(shí)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已經(jīng)定義好了,那么,就可以CONNECT了
//之所以為了要把連接和數(shù)據(jù)處理封成一個(gè)類,就是為了方便管理數(shù)據(jù),這點(diǎn)在服務(wù)端就會有明顯的感覺了
boost::shared_ptr<client> client_ptr(new client(io_service,endpoint));
//執(zhí)行收發(fā)數(shù)據(jù)的函數(shù)
io_service.run();
return 0;
}

修改192.168.1.119為127.0.0.1,然后先運(yùn)行server,再運(yùn)行client,一切ok.


轉(zhuǎn)載于:https://www.cnblogs.com/lzjsky/archive/2011/04/15/2017198.html

總結(jié)

以上是生活随笔為你收集整理的Boost asio学习笔记之二—— 网络编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。