2013-03-11 103 views
0

使用Boost :: asio Libs构建TCP客户端。我的程序有发送命令到Boost asio中的TCP客户端

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

} 

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

? "" 
ERROR: Unknown command 

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

+0

如果你看到正确的命令被发送,那么你为什么假设问题出在发送命令的代码中?如果服务器不接受该命令,则可以肯定该命令是错误的或者您需要一些身份验证。但是这与C++,Boost或其他任何相关的东西无关。 – 2013-03-11 13:41:38

+0

其实我是这么认为的,但命令是正确的,没有认证问题。只有我得到的提示是写缓冲区有问题。但作为初学者,我真的不知道我能在那里做些什么。 – 2013-03-11 13:45:44

+0

你说你有一个读写器线程,但我看不到保护你的_socket的互斥锁。也许你有线程问题?如果您在终端程序中手动发送相同的命令,会发生什么情况? – metal 2013-03-11 13:52:00

回答

2

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)); 

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

+0

看起来像解决了问题... – 2013-03-11 14:35:52