2011-12-13 94 views
1

我一直坚持这个过去5个小时左右..对不起,如果问题太明显/ noob,但我是noob自己,当涉及到提升:: asio或一般tcp/ip。Boost :: asio阻止Tcp服务器混淆

所以这里是问题所在。我想修改blocking tcp server example

void session(socket_ptr sock) 
{ 
    try 
    { 
    for (;;) 
    { 
     char data[max_length]; 

     boost::system::error_code error; 
     size_t length = sock->read_some(boost::asio::buffer(data), error); 
     if (error == boost::asio::error::eof) 
     break; // Connection closed cleanly by peer. 
     else if (error) 
     throw boost::system::system_error(error); // Some other error. 

     boost::asio::write(*sock, boost::asio::buffer(data, length)); 
    } 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception in thread: " << e.what() << "\n"; 
    } 
} 

我想要做的就是保存所有数据块或read_some方法到一定的缓冲在这个例子中的std :: string,然后做一些与他们发送答复前回:

const int max_length = 10; 

typedef boost::shared_ptr<tcp::socket> socket_ptr; 

void session(socket_ptr sock) 
{ 
    std::string dataReceived = ""; 
    try 
    { 
     for (;;) 
     { 
      char data[max_length] = {'\0'}; 
      boost::system::error_code error; 
      size_t length = sock->read_some(boost::asio::buffer(data), error); 
      dataReceived += std::string(data, length); 
      if (error == boost::asio::error::eof) 
       break; // Connection closed cleanly by peer. 
      else if (error) 
       throw boost::system::system_error(error); // Some other error. 
      //boost::asio::write(*sock, boost::asio::buffer(&dataReceived[0], dataReceived.size())); 
     } 
     boost::asio::write(*sock, boost::asio::buffer(&dataReceived[0], dataReceived.size())); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "Exception in thread: " << e.what() << "\n"; 
    } 
} 

当我从循环中删除write客户端挂起。 dataReceived包含所有数据。缓冲区故意很小,因此不止一次调用read_some。在调试器中,控制器永远不会进入循环外部的write方法。我可能做错了一些事情。但我无法找出什么。

方问题:

什么是有一些UI和后端进程之间的套接字连接的简单的解决方案?

回答

1

可能它会挂起,因为客户端等待服务器回复并且不发送新数据。

此外,服务器只有在连接关闭时才会退出窗体循环,并且无处可见write数据。

+0

是的,但这并不能解决问题。为什么不在for循环之外执行'write'? – FailedDev

+1

@FailedDev,看你的循环。你的服务器读取一些数据并等待另一个数据到达。只有当客户端断开连接时,循环才会终止,'write'永远不会在有效的套接字上执行。 – Abyx

+0

那么,我怎么能做到我想要的,就是拿走所有的数据,直到没有剩下的东西,对它做些什么,然后再写回一些东西?这个例子不可能吗?感谢您的帮助。 +1 – FailedDev