boost异步TCP服务器写入错误
boost asynchronous TCP server write error
我遇到了一个问题,我在客户端和服务器之间有一个TCP连接,当客户端初始化时,他向服务器发送了一条消息,服务器通过welcom消息回答。
所有这些在本地网络上都可以正常工作。
所以我的问题是我使用async_write和async_read(因为我需要我的服务器是异步的)我的客户端将消息发送到服务器,服务器看到并回答,但我的客户端从未收到welcom消息。
否则,当我关闭服务器时,客户端会收到欢迎消息。
这是我的服务器代码:
main.cpp
int main()
{
try
{
boost::asio::io_service io_service;
tcp_server server(io_service, 7171);
io_service.run();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
tcp_server
class tcp_server
{
public:
tcp_server(boost::asio::io_service& io_service, int port) // (1)
: m_acceptor(io_service, tcp::endpoint(tcp::v4(), port))
{
std::cout << "Port : " << port << std::endl;
start_accept();
}
private:
void start_accept()
{
tcp_connection::pointer new_connection = tcp_connection::create(m_acceptor.io_service());
m_acceptor.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
}
void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error) // (4)
{
if (!error)
{
std::cout << "Get one client!" << std::endl;
new_connection->start();
start_accept(); // (5)
}
}
tcp::acceptor m_acceptor;
};
tcp_连接
class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& ios)
{
pointer new_connection(new tcp_connection(ios) );
return new_connection;
}
tcp::socket& socket()
{
return m_socket;
}
void do_read() // (1)
{
boost::asio::async_read(m_socket, boost::asio::buffer(m_buffer), // (3)
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error)
);
}
void start()
{
m_message = "Welcome on the server n";
boost::asio::async_write(m_socket, boost::asio::buffer(m_message),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error)
);
}
private:
tcp_connection(boost::asio::io_service& io_service)
: m_socket(io_service)
{ }
void handle_write(const boost::system::error_code& error)
{
std::cout << "handle_write : "<< m_message << std::endl;
if (!error)
do_read(); // (2)
else
std::cout << error.message() << std::endl;
}
void handle_read(const boost::system::error_code& error) // (6)
{
std::cout << "handle read" << m_buffer.data() <<std::endl;
if (!error)
do_read();
else
close();
}
void close() // (7)
{
m_socket.close();
}
tcp::socket m_socket;
std::string m_message;
boost::array<char, 128> m_buffer;
};
我不明白为什么?我该如何避免这种情况?
请参阅async_read的手册:
此函数用于异步读取一定数量的字节流中的数据。函数调用总是立即返回。异步操作将继续,直到出现以下情况之一条件是真的:
- 提供的缓冲区已满。也就是说,传输的字节等于缓冲区大小之和
- 出现错误
在您的情况下,在对等方关闭套接字之前,这两个条件都不满足。
您应该使用async_read_some
(或async_read_until
,但它可能有点复杂)。
相关文章:
- 来自带有mbedtls TLS的Mongoose Web服务器的错误消息
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 提升 asio 回声服务器示例中的黑客或错误?
- 端口转发错误:端口转发未转发到服务器
- UDP服务器绑定到错误的端口号
- 服务器客户端通过原始数据错误C 发送接收结构
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- UDP 客户端到 UDP 服务器的问题,出现 10057 错误
- 接收音频块的异步TCP服务器会出现访问违规错误
- 使用Seasocks Echo服务器构建错误
- 使用FFMPEG代码的RTSP服务器的FFMPEG版本错误
- 错误代码1024 TFTP服务器
- 无法将主机名"localhost"转换为地址:未知服务器错误
- 可视化如何使用C++程序获取DHCPV6服务器IP.我尝试使用DHCPv6RequestParams,但总是收到错误代码
- 为什么这C++ASIO,当执行HTTP / SSL请求时,BEAST服务器会进入错误状态
- 如何调试 gRPC 服务器崩溃而没有任何错误
- Internet Connect在尝试连接到SFTP服务器时返回错误12002
- 错误请求,您的浏览器发送了此服务器无法理解的请求 - Qt Websocket 服务器
- Winsock2错误:服务器在连接到客户端时崩溃