2012-04-24 16 views
6

का उपयोग करने वाले प्रोग्राम में एसएसएल को एकीकृत करना मेरे पास एक टीसीपी नेटवर्किंग लाइब्रेरी है जो प्रोटोकॉल (रेडिस, http आदि) का एक गुच्छा लागू करती है, और उन्हें बीएसडी सॉकेट का उपयोग करके लागू किया जाता है।बीएसडी सॉकेट

बहुत सारे कोड बीएसडी सॉकेट के लिए चुनने वाले() और अन्य कार्यों का उपयोग करते हैं। क्या मैं यह मानने में सही हूं कि यह एसएसएल सॉकेट पर काम नहीं करेगा? या वे इस तरह काम करेंगे?

मैं बस सोच रहा हूं कि एसएसएल और बीएसडी सॉकेट इतने अलग हैं कि उन्हें कार्यान्वयन के लिए एक पूरी तरह से अलग दृष्टिकोण की आवश्यकता है।

+1

एसएसएल संचार सामान्य "बीएसडी" सॉकेट का उपयोग करता है, यह सिर्फ एक और प्रोटोकॉल स्तर है उदा। टीसीपी। –

उत्तर

6

मान लीजिए कि आप ओपनएसएसएल का जिक्र कर रहे हैं, यह सॉकेट के शीर्ष पर बैठता है, यह इसे प्रतिस्थापित नहीं करता है। तो सभी प्रत्यक्ष सॉकेट ऑपरेशंस, जैसे select(), अभी भी काम करते हैं। अंतर यह है कि ओपनएसएसएल आपके लिए पढ़ने और लिखने को संभालता है ताकि आप recv()ssl_read() और send()ssl_write() के साथ प्रतिस्थापित कर सकें, लेकिन आप (और कुछ मामलों में) अभी भी select() का उपयोग कर सकते हैं। हालांकि, जब भी आप चाहें तो इसे कॉल नहीं कर सकते, आपको तब तक इंतजार करना पड़ेगा जब तक ओपनएसएसएल आपको कॉल करने के लिए कहता है। तो, उदाहरण के लिए, यदि आपके पास रीडिंग लूप है जो पहले select() पर कॉल करता है और फिर recv() पर कॉल करता है तो केवल select() पठनीयता की रिपोर्ट करता है, तो आपको उस तर्क को चारों ओर स्वैप करना होगा। ssl_read() पहले कॉल, और फिर select (कॉल) केवल तभी ssl_read() रिटर्न या तो SSL_ERROR_WANT_READ या SSL_ERROR_WANT_WRITE (ध्यान दें कि ssl_read() आंतरिक रूप से संचालन लेखन प्रदर्शन कर सकते हैं, और ssl_write() आंतरिक रूप से संचालन पढ़ने प्रदर्शन कर सकते हैं)।

2

एक बात जो दिमाग में आती है वह यह है कि आपको एफडी पर चयन नहीं करना चाहिए जिसके माध्यम से एसएसएल कनेक्शन चलता है। ऐसा इसलिए है क्योंकि उदाहरण के लिए यह कह सकता है कि आप इसे से पढ़ सकते हैं जबकि ssl_read अवरुद्ध होगा। इसके बाद एसएसएल द्वारा एक महत्वपूर्ण पुन: बातचीत करने के लिए उदाहरण दिया गया है और आवेदन डेटा उपलब्ध नहीं हो सकता है। यह pitfals में से एक है।

+1

असल में, चुनें() अभी भी उपयोग किया जाता है, लेकिन प्रोटोकॉल तर्क को चयन नहीं करना चाहिए() लेकिन बफर में डीकोड किए गए डेटा की उपलब्धता। –

0

यह देर हो सकती है, लेकिन भविष्य के उपयोगकर्ताओं के लिए एक अच्छा संदर्भ दे सकता है। यूआरएल http://developerweb.net/viewtopic.php?id=6824 पर चयन() फ़ंक्शन का उपयोग करने पर एक अच्छा धागा है। एक उदाहरण उद्धृत के रूप में केवल SSL_read() या SSL_write() प्रदर्शन के बाद इस प्रकार

int sslsock_handle_nbio (ssl, ret, totv) 
    void   *ssl;   /* -> the SSL info      */ 
    int    ret;   /* the SSL I/O function return value */ 
    struct timeval *totv;   /* -> timeout info, or NULL    */ 
{ 
    int  sfd, i; 
    fd_set rset, wset; 

    sfd = SSL_get_fd (ssl); 
    i = SSL_get_error (ssl, ret); 

    if (i == SSL_ERROR_WANT_READ) { 
    do { 
     FD_ZERO (&rset); 
     FD_SET (sfd, &rset); 
     i = select (sfd + 1, &rset, NULL, NULL, totv); 
    } while ((i < 0) && (errno == EINTR)); 
    if (i == 0) { 
     /* the select() timed out */ 
     ret = -2; 
     errno = ETIMEDOUT; 
    } else { 
     /* either an error, or it's readable */ 
     ret = i; 
    } 
    } else if (i == SSL_ERROR_WANT_WRITE) { 
    do { 
     FD_ZERO (&wset); 
     FD_SET (sfd, &wset); 
     i = select (sfd + 1, NULL, &wset, NULL, totv); 
    } while ((i < 0) && (errno == EINTR)); 
    if (i == 0) { 
     /* the select() timed out */ 
     ret = -2; 
     errno = ETIMEDOUT; 
    } else { 
     /* either an error, or it's writable */ 
     ret = i; 
    } 
    } 
    /* else, leave "ret" alone, and return it as-is */ 

    return (ret); 
} 

यह है।

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