【问题标题】:boost asio connected but can not send messageboost asio已连接但无法发送消息
【发布时间】:2016-04-07 17:04:27
【问题描述】:

我正在编写简单的套接字类。我正在尝试编写套接字 根据例子http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_client.cpp

我可以连接到服务器(我在日志中看到它)但我无法发送或接收消息。在 Wireshark 中,我看不到传出消息,但可以看到传入消息。 据我了解 io_service 在不同的线程中运行,应该可以接收消息或发送消息。

(这是不完整的课程,因为我停在了这个描述的问题上)

Ioservice 在类(主)之外定义

#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.h”

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

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:
        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 上的教程示例重新开始,一旦您完成了这些,您将对发生的事情有更好的理解。

    【讨论】:

    • 另外加上t.join()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多