2010-08-20 4 views
5

मेरे एप्लिकेशन में एक एएसओ सर्वर सॉकेट है जिसे आईपी की परिभाषित सूची से कनेक्शन स्वीकार करना होगा।boost :: asio async_accept कनेक्शन को अस्वीकार करें

इस फिल्टर, आवेदन के द्वारा किया जाना चाहिए (सिस्टम के द्वारा नहीं), क्योंकि यह किसी भी समय बदल सकते हैं

ग्राहक एक acces_denied प्राप्त करना चाहिए (मैं किसी भी समय इस सूची को अद्यतन करने में सक्षम होना चाहिए) त्रुटि।

मुझे लगता है कि जब हैंडल_एसेप्ट कॉलबैक कहा जाता है, तो एसईएन/एसीके पहले से ही भेजा जा चुका है, इसलिए जब मैं कनेक्ट आईपी की अनुमति नहीं देता तो क्रूरता से बंद करना नहीं चाहता हूं। मैं क्लाइंट व्यवहार का प्रबंधन नहीं करता हूं, शायद यह तब भी कार्य नहीं करता जब कनेक्शन अस्वीकार कर दिया जाता है और केवल सहकर्मी द्वारा बंद किया जाता है, इसलिए मैं सबकुछ साफ करना चाहता हूं। (लेकिन यह पल के लिए मैं क्या कर रहा हूं)

क्या आप जानते हैं कि मैं यह कैसे कर सकता हूं ???

मेरे पहुँच सूची std :: तार के एक कंटेनर है (लेकिन मैं कुछ और की एक countainer को रूपांतरित कर सकते हैं ....)

आपको बहुत बहुत

+0

मुझे लगता है कि आप asio का उपयोग कर यह नहीं कर सकते – gomons

उत्तर

4

async_accept विधि एक अधिभार है धन्यवाद सहकर्मी एंडपॉइंट प्राप्त करने के लिए। आप उस मूल्य की तुलना अपने async_accept हैंडलर के अंदर कर सकते हैं। यदि यह आपके कंटेनर में किसी प्रविष्टि से मेल नहीं खाता है, तो सॉकेट को दायरे से बाहर जाने दें। अन्यथा, इसे अपने उपकरण द्वारा आवश्यकतानुसार संभाल लें।

0

मुझे आपके ऐप का विवरण नहीं पता है, लेकिन इस तरह मैं इसे करूँगा।

स्वीकार हैंडलर में/लैम्ब्डा

void onAccept(shared_ptr<connection> c, error_code ec) 
{ 
    if (ec) { /*... */ } 
    if (isOnBlackList(c->endpoint_)) 
    { 
     c->socket_.async_write(/* a refusal message */, 
     [c](error_code, n) 
     { 
      c->socket_.shutdown(); 
      // c fizzles out of all contexts... 
     }); 
    } 
    else 
    { 
     // successful connection execution path 
    } 
}