我正在编写简单的socket类。我正在尝试编写套接字 根据示例http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_client.cpp
我可以连接到服务器(我在日志中看到它)但我无法发送或接收消息。在wireshark中,我看不到外发消息,但我可以看到收到的消息。 据我所知,io_service在不同的线程中运行,应该可以接收消息或发送消息。
(这是不完整的课程,因为我停止了这个描述的问题)
Ioservice在class(main)之外定义
#include <iostream>
#include <thread>
#include <boost/thread/thread.hpp>
#include "TCP/TCPSocket.h"
using namespace std;
int main()
{
Traces::SetTraceFolder("trace");
boost::asio::io_service io_service;
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
TCPSocket socket("192.168.0.7", "6000", io_service);
char *c = new char[100];
while (true) {
std::cin >> *c;
socket.WriteMessage(c);
}
delete [] c;
return 0;
}
我的课程:
TCPSocket::TCPSocket(const std::string &adress, const std::string &port, boost::asio::io_service & serviceio)
: io_service(serviceio),
socket_(io_service),
resolver(io_service)
{
Traces() << "\n" << "LOG: TCPSocket::TCPSocket(const std::string &adress, const std::string &port)";
tcp::resolver::query query(adress, port);
querywsk = new tcp::resolver::query(" ", " ");
*querywsk = query;
iterator = resolver.resolve(*querywsk);
boost::asio::async_connect(socket_, iterator,
boost::bind(&TCPSocket::HandleConnect, this,
boost::asio::placeholders::error));
}
void TCPSocket::HandleConnect(const boost::system::error_code& error)
{
Traces() << "\n" << "LOG: void TCPSocket::HandleConnect(const boost::system::error_code& error)";
if (!error)
{
boost::asio::async_read(socket_,
boost::asio::buffer(data, std::strlen(data)),
boost::bind(&TCPSocket::HandleConnect, this,
boost::asio::placeholders::error));
} else
{
Traces() << "\n" << "ERR:";
}
}
void TCPSocket::WriteMessage(char *dataToSend)
{
io_service.post(boost::bind(&TCPSocket::Write, this, dataToSend));
}
void TCPSocket::Write(char *dataToSend)
{
Traces() << "\n" << "LOG: void TCPSocket::Write(char *dataToSend)";
data = dataToSend;
boost::asio::async_write(socket_,
boost::asio::buffer(data, std::strlen(data)),
boost::bind(&TCPSocket::HandleWrite, this,
boost::asio::placeholders::error));
}
void TCPSocket::HandleWrite(const boost::system::error_code& error)
{
Traces() << "\n" << "LOG: void TCPSocket::HandleWrite(const boost::system::error_code& error)";
if (!error)
{
boost::asio::async_write(socket_,
boost::asio::buffer(data,
100),
boost::bind(&TCPSocket::HandleWrite, this,
boost::asio::placeholders::error));
}
else
{
Traces() << "\n" << "ERR:";
}
}
答案 0 :(得分:2)
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
在代码的早期阶段,io_service没有工作要做。
所以线程启动,io_service在线程中启动,看到无事可做,因此立即停止。
因此没有任何反应。
您必须在设置工作后启动io_service。
您的代码还有其他严重问题,例如在侦听连接请求的套接字服务器和接收和传输消息的连接之间,你似乎有点困惑。
我建议您在http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/tutorial.html处完成教程示例时重新开始。一旦您完成了这些教程,您就可以更好地了解正在发生的事情。