2009-11-11 11 views
5

मैं Boost.Asio के साथ दो त्रुटियों के साथ संघर्ष कर रहा हूँ।बूस्ट। एएसओ दस्तावेज मौजूद नहीं है। इन त्रुटियों का क्या अर्थ है?

पहली बार होता है जब मैं एक सॉकेट पर डेटा प्राप्त करने का प्रयास करें:

char reply[1024]; 
boost::system::error_code error; 
size_t reply_length = s.receive(boost::asio::buffer(reply, 1024), 0, error); 
if (error) cout << error.message() << endl; //outputs "End of file" 

दूसरा तब होता है जब मैं एक (मान्य!) देशी सॉकेट से एक आईपी :: टीसीपी बनाने का प्रयास करें :: सॉकेट:

boost::asio::io_service ioserv; 
boost::asio::ip::tcp::socket s(ioserv); 

boost::system::error_code error; 
s.assign(boost::asio::ip::tcp::v4(), nativeSocket, error); 
if (error) cout << error.message() << endl; //outputs "The parameter is incorrect" 

इन सभी परेशानियों के साथ कोई दस्तावेज नहीं है, मैं बीएसडी सॉकेट पर वापस जाने का लुत्फ उठा रहा हूं, लेकिन मुझे अपनी समस्याएं हैं ... इसलिए अगर कोई मदद कर सकता है, तो मैं वास्तव में सराहना करता हूं यह।

संपादित करें: के बारे में नंबर 2, nativeSocket thusly घोषित किया जाता है:

SOCKET nativeSocket = INVALID_SOCKET; 
nativeSocket = accept(svr_sock, (struct sockaddr*)&sin, &size); 

उसके बाद, कुछ अन्य बातें सॉकेट से किया जाता है - अर्थात्, के रूप में यह स्थापित करने ioctlsocket का उपयोग कर गैर अवरुद्ध, और setsockopt का उपयोग कर SO_LINGER और SO_OOBINLINE के लिए।

+0

क्या आप देशी सॉकेट के लिए घोषणा/प्रारंभिकरण दे सकते हैं? मुझे लगता है कि प्रो 2 के साथ समस्याएं इसके साथ हैं। – rcollyer

+0

बस इसे जोड़ा गया। –

+0

आपके पहले प्रश्न के लिए: "फ़ाइल का अंत" आमतौर पर इंगित करता है कि कनेक्शन सहकर्मी द्वारा बंद कर दिया गया था। –

उत्तर

1

यह किसी भी माध्यम से आपकी दूसरी समस्या का पूरा समाधान नहीं है। कोई भी त्रुटि जो इसे उत्पन्न करती है उसे boost::system::error_code में मैप किया जाना चाहिए, लेकिन मुझे boost/system/error_code.hpp में ऐसा कुछ नहीं मिला है, इसलिए मुझे नुकसान हुआ है कि इसका क्या अर्थ है।

लेकिन, 1.39, assign को बढ़ावा देने के लिए कोड को देखने के बाद अंततः detail::reactive_socket_service< Protocol, Reactor >.assign (या detail::win_iocp_socket_service<Protocol>, यदि आप विंडोज़ का उपयोग कर रहे हैं) को सौंप दिया गया है। यह केवल boost/asio/detail/reactive_socket_service.hpp में दो स्थानों पर एक त्रुटि का निर्माण किया जा सकता है:

if (is_open(impl)) 
{ 
    ec = boost::asio::error::already_open; 
    return ec; 
} 

या

if (int err = reactor_.register_descriptor(
     native_socket, impl.reactor_data_)) 
{ 
    ec = boost::system::error_code(err, 
     boost::asio::error::get_system_category()); 
    return ec; 
} 

, चूंकि आप एक already_open त्रुटि नहीं मिल रहे हैं, त्रुटि कोड के दूसरे बिट से करना चाहिए। रिएक्टर प्रकार ifdef/elifboost/asio/stream_socket_service.hpp में जोड़े के अनुक्रम से आता है, और epoll_reactor में केवल register_descriptor फ़ंक्शन उपलब्ध किसी भी त्रुटि को फेंक सकता है (और निश्चित रूप से detail::win_iocp_socket_service<Protocol>.assign भी कर सकता है)। epoll_reactor में त्रुटि, sys/epoll.h से आता है विशेष रूप से:

int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); 
if (result != 0) 
    return errno; 

खिड़कियों कार्यान्वयन में, संबंधित कोड

if (iocp_service_.register_handle(native_socket.as_handle(), ec)) 
    return ec; 

है मुझे लगता है कि यही आपकी त्रुटि का मूल है, लेकिन ईमानदारी से, मैं नहीं कर सकता इस बिंदु से पहले इसका पता लगाएं।

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