send
और receive
जैसे सॉकेट फ़ंक्शन सिग्नल द्वारा बाधित किए जा सकते हैं। इसके कारण कुछ अतिरिक्त कोड की आवश्यकता है, उदा। errno == EINTR
के लिए जांचें। यह संबंधित मैन पेजों पर वर्णित है।ओपनएसएसएल और संकेत
मुझे आश्चर्य है कि यह कैसे काम करता है जब OpenSSL फ़ंक्शंस का उपयोग किया जाता है, उदा। SSL_write
, SSL_read
। उनके मैन पेज सिग्नल के बारे में कुछ नहीं कहते हैं। मैंने इसके लिए भी Google की कोशिश की, लेकिन भाग्य के बिना। क्या आपको पता है कि ओपनएसएसएल आंतरिक रूप से संकेतों को संभालता है, या कुछ अतिरिक्त कोड की आवश्यकता है? यदि हां, तो कैसे जांचें कि सिग्नल द्वारा फ़ंक्शन कॉल बाधित किया गया था या नहीं?
अद्यतन:
लग रहा है कि OpenSSL पुनः संभाल नहीं करता है। यह केवल बीआईओ ऑब्जेक्ट पर "पुनः प्रयास करना" ध्वज सेट करता है। तो मैं पता लगाने के लिए अगर कॉल बाधित किया गया था और फिर से प्रयास करें की जरूरत है कुछ इस तरह उपयोग करने की आवश्यकता:
int result = SSL_write(ssl, buff, length);
if ((result < 0) && BIO_should_retry(SSL_get_wbio(ssl)))
// need to retry
int result = SSL_read(ssl, buff, length);
if ((result < 0) && BIO_should_retry(SSL_get_rbio(ssl)))
// need to retry