2012-09-13 13 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" में, सॉकेट खुला नहीं है और मुझे "खराब फ़ाइल डिस्क्रिप्टर" मिला है। मैंने दस्तावेज़ और वेब में कुछ उदाहरण पढ़े, लेकिन वे एसिंक हैं। मुझे लगता है कि मेरी सरल मांग के लिए यह जरूरी नहीं है।को बढ़ावा देने के दौरान "खराब फ़ाइल डिस्क्रिप्टर" मिला :: एएसओ और बूस्ट :: थ्रेड

मैं त्रुटि को कैसे ठीक कर सकता हूं? किसी भी मदद की सराहना की

+0

संभवत: ऐसा होता है क्योंकि मुख्य थ्रेड (सॉकेट) एक ही समय में स्वीकार कार्यान्वित करता है, एक और धागा सॉकेट के साथ काम करने की कोशिश करता है। संदर्भ द्वारा पासिंग, आप एक ही सॉकेट उदाहरण के साथ काम कर रहे हैं। –

+0

@AlexFarber मुझे ऐसा नहीं लगता है। क्योंकि मैं सर्वर से कनेक्ट करने के लिए केवल एक क्लाइंट का उपयोग करता हूं, केवल एक कनेक्शन होता है। – leezii

+0

लेकिन साथ ही, जब एक क्लाइंट सॉकेट के साथ काम करने का प्रयास करता है, तो मुख्य धागा एक ही सॉकेट में स्वीकार्य ऑपरेटर लागू करता है। –

उत्तर

10

आपका सॉकेट एक अस्थायी वस्तु है, तो आप इसे करने के लिए एक reffence पारित लेकिन वस्तु क्षेत्र से बाहर जा रहा है और धागा यह प्रक्रिया से पहले नष्ट किया जा रहा। shared_ptr<socket> का प्रयोग करें या उन्हें एक कंटेनर में रखें।

+0

आप सही हैं। धन्यवाद। – leezii

संबंधित मुद्दे