後開始的線程所以我試圖建立一個服務器,接受套接字上的連接,然後創建一個線程圍繞執行一個函數,使用新接受的連接的文件描述符。我遇到的問題是,當我啓動線程時,服務器返回接受另一個連接(如果有的話)但它不會阻塞?它似乎是從循環返回,我不知道它爲什麼這樣做。該代碼正在運行的是:程序終止accept()
listen(sockfd,10);
int i = 0;
for(;;)
{
std::cout << "Before accept" << endl;
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
std::cout << "After accept" << endl;
if (newsockfd < 0)
{
std::cout << newsockfd << ": Error on accept" << endl;
continue;
}
else
std::cout << newsockfd << ": Connection accepted!" << endl;
boost::thread(boost::bind(&Class::FunctionToRun, this, newsockfd)).start_thread();
std::cout << ++i << endl;
}
輸出到腳趾控制檯:
Socket opened! fd = 3
Before accept
After accept
4: Connection accepted!
1
Before accept
[program terminates]
但如果接受塊,同時等待套接字上一個新的連接,那麼怎麼來的程序之前「之後,終止接受「被打印?
進程是否崩潰? – 2014-11-20 20:48:09
你不希望它返回並再次接受()嗎?當你說「終止」時,誰終止了它?你殺了它,還是它自己死了? – Barry 2014-11-20 20:48:23
@BrianWalker我不這麼認爲。運行在它自己的線程中的進程應該沒問題。如果線程中發生的事情沒有按預期發生,它可以終止程序的其餘部分嗎? – Stapps 2014-11-20 20:50:50