一个基于boost 库 asio 的聊天程序

没有英文名 2012-02-23 08:26:01
一个基于boost 库 asio 的聊天程序,我在服务器端知道 客户端的IP地址 怎么向每个客户端发送数据 比如说 我在服务器端有10 客服端的IP地址 怎么把一条数据发送给这10个客户端??

服务器端源代码如下:

#include "stdafx.h"
#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;
using namespace std;
#define max_len 1024
string stIp[100];
class clientSession:public boost::enable_shared_from_this<clientSession>
{
public:
tcp::socket m_socket;
char bufRec[max_len];
char bufSed[max_len];

typedef boost::shared_ptr<clientSession> session_ptr;
public:
clientSession(boost::asio::io_service& ioservice):m_socket(ioservice)
{
memset(bufRec,0,sizeof(bufRec));
memset(bufSed,0,sizeof(bufSed));
for(int i=0;i<100;i++)
{
stIp[i]="";
}
}
~clientSession()
{}
tcp::socket& socket()
{
return m_socket;
}
void start()
{
m_socket.async_read_some(boost::asio::buffer(bufRec,max_len),
boost::bind(&clientSession::handle_read,shared_from_this(),
boost::asio::placeholders::error)
);
boost::asio::async_write(m_socket,
boost::asio::buffer("link successed!"),
boost::bind(&clientSession::handle_write,shared_from_this(),
boost::asio::placeholders::error)
);
}
private:
void handle_write(const boost::system::error_code& error)
{
if(error)
{
m_socket.close();
}
for(int i=0;i<100,!stIp[i].empty();i++) //在 这里实现 向各个客户端发送某个客户端所说的话
{
m_socket.remote_endpoint().address().from_string(stIp[i].c_str());
boost::asio::async_write(m_socket,
boost::asio::buffer(bufRec),
boost::bind(&clientSession::handle_write,shared_from_this(),
boost::asio::placeholders::error)
);
}
}
void handle_read(const boost::system::error_code& error)
{
if(!error)
{

cout <<m_socket.remote_endpoint().address()<<" say : "<< bufRec << endl;
m_socket.async_read_some(boost::asio::buffer(bufRec,max_len),
boost::bind(&clientSession::handle_read,
shared_from_this(),
boost::asio::placeholders::error)
);
}
else
{
m_socket.close();
}
}
};
class serverApp
{
private:
boost::asio::io_service& m_ioservice;
tcp::acceptor acceptor_;

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)
{
//实现对每个客户端的数据处理
session->start();
//每一个session就是一个客户端
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)
);

cout << "get a new client: "<<session->m_socket.remote_endpoint().address() << endl;
int m=0;
stIp[m++]=session->m_socket.remote_endpoint().address().to_string();
}
}
};
int main(int argc , char* argv[])
{
cout<<"服务器端启动!"<<endl;
boost::asio::io_service myIoService;
tcp::endpoint endPoint(tcp::v4(),8100);
serverApp sa(myIoService,endPoint);
myIoService.run();
return 0;
}
...全文
440 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellotestyou 2014-05-21
  • 打赏
  • 举报
回复
在handle_write里回调了handle_write这样做是什么意思呢?
没有英文名 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cxsjabcabc 的回复:]

可以循环对这10个地址发送数据
[/Quote]
我代码中有错误吗 ? 大侠 用什么函数的?
程序员小迷 2012-02-24
  • 打赏
  • 举报
回复
可以循环对这10个地址发送数据
程序员小迷 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cc5412330 的回复:]

引用 4 楼 cxsjabcabc 的回复:

引用 3 楼 cc5412330 的回复:

引用 2 楼 cxsjabcabc 的回复:

可以循环对这10个地址发送数据

我代码中有错误吗 ? 大侠 用什么函数的?
m_socket.remote_endpoint().address().from_string(stIp[i].c_str());

执行后,会报一个……
[/Quote]

可能我们的环境不大一样,我在mac的 gcc4.2下编译的;而且客户端是用普通socket写的;
可能是我这边不一样的环境导致的
Topsuixin 2012-02-24
  • 打赏
  • 举报
回复
围观,帮忙顶下....
没有英文名 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cxsjabcabc 的回复:]

引用 3 楼 cc5412330 的回复:

引用 2 楼 cxsjabcabc 的回复:

可以循环对这10个地址发送数据

我代码中有错误吗 ? 大侠 用什么函数的?
m_socket.remote_endpoint().address().from_string(stIp[i].c_str());

执行后,会报一个异常:

服务器端启动!
get a ……
[/Quote]
我用VS2011 是没错的

程序员小迷 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cc5412330 的回复:]

引用 2 楼 cxsjabcabc 的回复:

可以循环对这10个地址发送数据

我代码中有错误吗 ? 大侠 用什么函数的?
[/Quote]

m_socket.remote_endpoint().address().from_string(stIp[i].c_str());

执行后,会报一个异常:

服务器端启动!
get a new client: 127.0.0.1
127.0.0.1 say :
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): remote_endpoint: Bad file descriptor

你那边有这种问题吗

64,664

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧