2012-10-31 11 views
5

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

मैं उपयोग कर रहा हूँ this site

यहाँ से मिला मैं के बारे में है कि क्या BIO_flush पढ़ने बफर पाती है या बफर लिखने स्पष्ट नहीं कर रहा हूँ .. :-( तो मैं सिर्फ जानना चाहता था वहाँ के लिए किसी भी अन्य तरीकों से है एसएसएल लिखने बफर फ्लश ...?

यहाँ मेरी क्लाइंट प्रोग्राम के बारे में जानकारी है।

  1. एसएसएल वस्तु (mSsl) SSL_new
  2. बनाने की प्रक्रिया का उपयोग कर बनाया जा रहा है टिंग TCP सॉकेट और सर्वर
  3. जैव वस्तु (mBio) BIO_new_socket का उपयोग कर बनाया जा रहा है के साथ संबंध बनाने (socket_id, BIO_NOCLOSE)
  4. SSL_set_bio (mSsl, mBio, mBio) का उपयोग एसएसएल वस्तु के लिए जैव वस्तु की स्थापना;
  5. एसएसएल_सेट_एफडी (एमएसएसएल, सॉकेट_आईडी) का उपयोग कर एसएसएल ऑब्जेक्ट में सॉकेट सेट करना;
  6. SSL_Connect (mSsl) का उपयोग कर सर्वर के साथ SSL कनेक्शन बनाना;

उपर्युक्त चरणों के बाद मैं लिखने और पढ़ने के लिए दो अलग-अलग धागे शुरू कर रहा हूं। सर्वर को डेटा लिखने के लिए थ्रेड लिखें SSL_write का उपयोग करें और थ्रेड पढ़ें सर्वर से डेटा पढ़ने के लिए SSL_Read का उपयोग करता है।

लिखें धागा में SSL_Write का उपयोग कर प्रत्येक पैकेट लेखन के बाद मैं BIO_flush (mBio) बोल रहा हूँ।

पूरे कार्यक्रम में मैं केवल जैव बफर फ्लश करने के लिए इस जगह में एमबीओ ऑब्जेक्ट का उपयोग कर रहा हूं।

जब मैं BIO_flush में दुर्घटनाग्रस्त में कुछ पैकेट, कार्यक्रम भेज रहा है ... डंप BIO_ctrl समारोह में अपनी कहते हैं के अनुसार शुरू करते हैं। मुझे इससे ज्यादा कुछ नहीं मिल रहा है।

क्या कोई भी लाइब्रेरी का उपयोग करता है जिसे मैंने उपरोक्त लिंक प्रदान किया है और एक ही समस्या का सामना कर रहा है ..? यदि हां, तो कृपया मुझे बताएं कि क्या आप समाधान जानते हैं।

कोई धागा तुल्यकालन नियम BIO_flush उपयोग करने के लिए है() ...? मेरा मतलब है कि BIO_flush SSL_Read को कॉल करना उसी समय ऐसा नहीं होना चाहिए ...?

उत्तर

2

बीआईओ_फ्लश का उपयोग डेटा लिखने के लिए किया जाता है। क्योंकि जैव संरचना अपने SSL_read/लिखने कॉल के बारे में पता नहीं है

आपका मिश्रण और BIO_flush और SSL_read/लिखने के मैच समस्याग्रस्त है।

आपको BIO_read/लिखने का उपयोग करने से बेहतर परिणाम मिलेंगे।

आप पूरी तरह SSL_read का उपयोग करने की जरूरत है/आप लिखते हैं BIOS का उपयोग कर से बचना चाहिए।

मुझे लगता है कि आप इस OpenSSL प्रलेखन के अंत में उदाहरण के साथ बहुत आगे मिलेगा।

Simple OpenSSL Client Example

आप अभी भी दुर्घटनाओं मिल रहे हैं जब कि उदाहरण की कोशिश कर रहा है, तो आप विशेष रूप से पुस्तकालय का निर्माण आप उपयोग कर रहे के साथ मुद्दों कर हो सकता है।

6

आप कहां से सीखते हैं कि लिखने के बाद लिखने वाले बफर को फ़्लश करने की आवश्यकता होगी?

मैं भी फ्लश फ़ंक्शन की तलाश में था, लेकिन उसे कोई नहीं मिला। SSL_write के लिए हर कॉल कम से कम एक SSL रिकॉर्ड उत्पादन और सॉकेट, जहां Nagle एल्गोरिथ्म एक पल के लिए कर्नेल में ऐसा करने से बफ़र हो सकता है के लिए बाहर का उत्सर्जन करता है और जल्दी से बाहर करने के लिए इसे प्रस्तुत:

मैं इसे इस तरह से काम करता है लगता है।

तो SSL_write में कोई बफरिंग नहीं है और इसलिए कोई फ्लश नहीं है!

मेरे पास फ्लश फ़ंक्शन होगा और सभी SSL रिकॉर्ड्स को ब्रिम पर भरें, लेकिन यह तब तक उपलब्ध नहीं है जब तक मैं देखता हूं। अब मैं अपनी खुद की बफरिंग करने और एसएसएल_write को जितनी संभव हो सके बड़ी कॉल करने की योजना बना रहा हूं।

बीटीडब्ल्यू: मैंने अभी एक छोटा परीक्षण कार्यक्रम लिखा है: यह एक लिखने के साथ एक बफर भेजता है और फिर मैं इसे फिर से चलाता हूं, प्रत्येक चरित्र के लिए SSL_write को बुलाता हूं। दोनों बार मैं टीसीपीडम्प चलाता हूं और वायर्सहार्क में मैं देख सकता था कि पहले रन में कुछ बड़े एप्लिकेशन डेटा रिकॉर्ड थे और दूसरे रन में कई छोटे रिकॉर्ड थे। तो मुझे लगता है कि यह पुष्टि की है।