2011-12-13 97 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