提升asio已连接但无法发送消息

时间:2016-04-07 17:04:27

标签: c++ sockets boost boost-asio

我正在编写简单的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;
}

我的课程:

包括&#34; TCPSocket.h&#34;

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:";
  }
}

1 个答案:

答案 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处完成教程示例时重新开始。一旦您完成了这些教程,您就可以更好地了解正在发生的事情。