2012-09-13 352 views
5
int func(boost::asio::ip::tcp::socket &socket) 
{ 
    boost::system::error_code ec; 
    socket.write_some(boost::asio::buffer("hello world!"), ec); 
    cout << socket.is_open() << endl; 
    if(ec) 
    { 
     cout << boost::system::system_error(ec).what() << endl; 
    } 
    return 0; 
} 

int main(int argc, char* argv[]) 
{ 
    using namespace boost::asio; 
    io_service iosev; 
    ip::tcp::acceptor acceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(), 1000)); 

    while(1) 
    { 
     ip::tcp::socket socket(iosev); 
     acceptor.accept(socket); 
     boost::thread t = boost::thread(func, boost::ref(socket)); 
    } 
    return 0; 
} 

我想讓一個新的線程處理新的連接。但在函數「func」中,套接字未打開,我得到了「壞文件描述符」。我在文檔和網頁中閱讀了一些示例,但它們是異步的。我認爲這對我的簡單需求沒有必要。當使用boost :: asio和boost :: thread時出現「Bad file descriptor」錯誤

我該如何解決這個錯誤?任何幫助表示讚賞

+0

可能發生這種情況的原因是主線程同時執行accept(套接字),因爲另一個線程試圖使用套接字。按引用傳遞,您正在使用相同的套接字實例。 –

+0

@AlexFarber我不這麼認爲。因爲我只使用一個客戶端來連接服務器,所以只有一個連接。 – leezii

+0

但是,與此同時,當一個客戶端嘗試使用套接字工作時,主線程將accept運算符應用於相同的套接字。 –

回答

10

你的套接字是一個臨時對象,你傳遞給它一個對象,但該對象超出了範圍並在線程處理之前被銷燬。使用shared_ptr<socket>或將它們放在容器中。

+0

你說得對。謝謝。 – leezii

相關問題