Boost asio 中的 TCP 客户端

Posted

技术标签:

【中文标题】Boost asio 中的 TCP 客户端【英文标题】:TCP client in Boost asio 【发布时间】:2013-03-11 13:17:17 【问题描述】:

我正在使用 Boost::asio Libs 构建一个 TCP 客户端。我的程序有一个 write() 线程向服务器发送命令

write(*_socket,boost::asio::buffer("sspi l1\n\n",sizeof("sspi l1\n\n")));

然后启动一个读取线程,该线程一直从缓冲区读取,因为任何其他客户端都可能从服务器广播消息

void TCP_IP_Connection::readTCP()


size_t l=0;

 this->len=0;
boost::system::error_code error;


try
  //loop reading all values from router
   while(1)
     

      //wait for reply??


    l=_socket->read_some(boost::asio::buffer(this->reply,sizeof(this->reply)),error);
    if(error)
        throw boost::system::system_error(error);

    if(l>0)
    

        this->dataProcess(l);

    
    else
        boost::this_thread::sleep(boost::posix_time::milliseconds(5000));


      _io.run();

       if(error==boost::asio::error::eof) //connection closed by router
         std::cout<<"connection closed by router";

       _io.reset();

     

   

catch (std::exception& e)
 
   std::cerr << e.what() << std::endl;
 


这个线程一直在while(1)循环中运行,当接收到的数据长度小于零时应该休眠。它读取所有数据并调用数​​据解析器函数。之后,写线程用于发送另一个命令,读线程运行。但是服务器发回的不是所需的响应

  ? ""
ERROR: Unknown command

我尝试使用wireshark。我可以看到命令正在正确发送。我在这里做错了什么?

【问题讨论】:

如果您看到发送了正确的命令,那么您为什么认为问题出在发送命令的代码中?如果服务器不接受该命令,则可以肯定该命令是错误的,或者您需要进行一些身份验证。但这与 C++、Boost 或任何相关内容无关。 其实我也是这么想的,但是命令是正确的,不存在认证问题。我得到的唯一提示是写缓冲区有问题。但作为一个初学者,我真的不知道我能在那里做什么。 你说你有一个读写线程,但我看不到保护你的_socket的互斥锁。也许你有线程问题?如果您在终端程序中手动发送相同的命令会发生什么? 如果我使用 netcat 发送,服务器会正​​确响应。关于互斥锁,是不是要锁定socket进行读写? 从接受的答案我想你没有发送正确的命令 - 你发送了命令和一个额外的尾随 \0 服务器不是很高兴。 【参考方案1】:

sizeof("sspi l1\n\n") 返回 10,但我只能计算该字符串中的 9 个字符。

试试这个:

const std::string cmd("sspi l1\n\n");
write(*_socket,boost::asio::buffer(cmd, cmd.length()));

或者当你把它作为一个字符串时就足够了

const std::string cmd("sspi l1\n\n");
write(*_socket,boost::asio::buffer(cmd));

第二个参数指定要使用的字符串的最大长度。但由于它是一个常量字符串,所以第二个参数并不是绝对必要的。

【讨论】:

以上是关于Boost asio 中的 TCP 客户端的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio::ip::tcp::iostream,首先启动客户端并等待服务器?

Boost.Asio 异步 TCP 客户端和多线程

Boost::asio - 如何中断阻塞的 tcp 服务器线程?

boost::asio 中的 NAT 打孔

Boost.Asio、tcp::iostream 和多线程

Boost ASIO TCP计时器客户端错误“解决:找不到指定的类”