- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试使用 boost 实现一个简单的 tcp 服务器,它接受客户端连接,并通过调用服务器公开的方法将一些信息发送回客户端。
这是我根据 Boost 教程创建的类:
#define WIN32_LEAN_AND_MEAN
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
#include <ctime>
#include <iostream>
#include <string>
#include "Logger.h"
class tcp_server_connection
: public boost::enable_shared_from_this<tcp_server_connection>
{
public:
typedef boost::shared_ptr<tcp_server_connection> pointer;
static pointer create(boost::asio::io_service& io_service)
{
return pointer(new tcp_server_connection(io_service));
}
tcp::socket& socket()
{
return socket_;
}
void start(string message)
{
swap(m, message);
boost::asio::async_write(socket_, boost::asio::buffer(m),
boost::bind(&tcp_server_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
private:
tcp_server_connection(boost::asio::io_service& io_service)
: socket_(io_service)
{
Logger::Log("main.log", "New TCP Server Connection");
}
void handle_write(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (error) {
Logger::Log("main.log", "TCP Server Write Error: ");
}
}
tcp::socket socket_;
string m;
};
class tcp_server
{
public:
tcp_server(boost::asio::io_service& io_service, int port)
: acceptor_(io_service, tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), port))
{
start_accept();
}
void write(string message) {
connection->start(message);
}
private:
void start_accept()
{
connection = tcp_server_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(connection->socket(),
boost::bind(&tcp_server::handle_accept, this, connection,
boost::asio::placeholders::error));
}
void handle_accept(tcp_server_connection::pointer new_connection,
const boost::system::error_code& error)
{
if (!error)
{
Logger::Log("main.log", "TCP Server Accepted Connection");
}
else {
Logger::Log("main.log", "TCP Server Error accepting Connection");
}
}
tcp::acceptor acceptor_;
tcp_server_connection::pointer connection;
};
我通过使用此方法启动线程来启动服务器:
void SetupServer() {
boost::asio::io_service io_service;
server = new tcp_server(io_service, serverPort);
io_service.run();
}
当我想向客户端写一些东西时,我会调用 server->write("Some Text"),但是async_write 引发异常并显示“访问冲突写入位置”。我相信可能有一些对象在它应该被清理之前就被清理了,但我不明白为什么以及在哪里,所以如果有人能给我一些关于为什么会发生这种情况以及如何解决它的见解,我将不胜感激。
提前感谢您的帮助。
最佳答案
好吧,我发现这个问题与 io_service 变量在作用域更改时被释放有关,而 hell 正在崩溃。
为了解决这个问题,我将 setupServer 更改为:
io_service = new boost::asio::io_service();
rankingServer = new tcp_server(*io_service, serverPort);
io_service->run();
并在使用它的类中的其他地方声明该变量:
boost::asio::io_service *io_service = NULL;
记住变量需要释放,调用
delete io_service;
希望这可能对某人有所帮助。
关于c++ - boost tcp_server async_write 错误 : access violation writing location,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25488358/
这是我的实现: 客户端 A 为客户端 B 发送消息 服务器通过async_read适量的数据处理消息和将等待来自客户端 A 的新数据(为了不阻止客户端 A) 之后服务器会处理信息(可能会做一个mysq
void Chat::Send(uint8_t* buffer, int length){ boost::asio::async_write(socket_,boost::asio::
我正在尝试使用 C++ 中的以下命令通过 TCP 套接字发送大约 50KByte 或更大的大量数据: boost::asio::async_write(sock, boost::asio::buffe
我正在使用一个 C 库,它可以提取 PDF 数据并通过回调为我提供该数据。使用了两个回调,一个为我提供作业 header ,另一个为我提供从 1 到 50MB block 不等的已提取数据。 然后我将
我正在尝试使用 async_write() 通过套接字将 jpeg 帧写入客户端。我用了 boost asynchronous TCP daytime server以示例作为起点。 #include
我这样调用 asio::async_write: namespace asio = boost::asio; using asio::ip::tcp; using std::string; share
我有一个非常特殊的问题。我编写了一个服务器,该服务器将从第三方接收到的数据写入连接的客户端。服务器在一段时间内可以正常写入客户端,但一段时间后,async_write 要么失败,要么写入永远不会返回。
我不确定为什么当我开始使用字符串作为缓冲区的 async_write() 时会出现段错误。我过去曾成功使用过此功能。 这是我得到段错误的方法: void StringSocket::sendLine(
我正在使用 Boost 通过 TCP 发送数据 async_write : std::shared_ptr::iterator> iter = std::make_shared::iterator>(
我正在聊天。出于某种原因,在其他客户端之间分发用户消息时,由 Server::msgHandler 组合在一起的字符串被 Connection::write #include #include #
我想写服务器(TCP/IP),我有一些问题,因为我不确定我的想法是否正确。 我需要一台只有一个线程的服务器。我需要向某些客户端读取和写入数据。我想使用 boost::asio 中的 async_acc
async_write(*this, BoostAsio::buffer(pck->_storage), boost::bind(&tcp_socket::handle_wrote, this, pc
我将展示一些代码; void wh(const boost::system::error_code& ec, std::size_t bytes_transferred) {
我目前正在使用 Asio C++ 库并围绕它编写了一个客户端包装器。我最初的方法是非常基本的,只需要在一个方向上流动。要求已经改变,我已经切换到使用所有异步调用。除了 asio::async_writ
我知道下一个 async_write() 应该在前一个完成时执行(有或没有错误,但完成时)。 我想知道在进行 async_write() 调用时,如果其中一个由于某种原因需要很长时间甚至永远不会结束(
我目前正在使用 boost::async_write 一次发送一次大缓冲区(大约 50KB)。结果是我在服务器端每 20 个缓冲区中收到大约一个损坏的缓冲区。 我的代码是这样的。省略了错误处理和其他细
情况如下 - 服务器正在向客户端发送数据,但是一些客户端已断开连接(不正常)。 然而,写入处理程序总是在没有任何关于管道损坏的错误的情况下完成。这是 TCP/IP 连接,所以我假设如果发送方(服务器)
在我的应用程序中,我必须为每个连接发送大约 10 kb/s 的速度。所有数据包都放在 std::deque 中。一个线程遍历双端队列并通过 asio::async_write 发送数据包。 我的问题是
现在我有一个 Connection 类,如下所示(不相关的东西被省略): class Connection : public std::enable_shared_from_this { public
当我调用 async_write() 时,在我再次调用 async_write() 之前,远程端不会接收数据。例如,我有 3 个数据包,a、b 和 c: SendPacket(a); // the r
我是一名优秀的程序员,十分优秀!