c++ - ميرور - كيفية عرض الموبايل على شاشة التلفزيون



فشل اتصال بينسل مع مأخذ غير حجب (0)

لدي ملقم أوبنسل الذي لديه وظيفة صدى كما هو موضح هنا والعميل كما هو موضح هنا . أدخلت بعض التغييرات الطفيفة على الخادم (على سبيل المثال تغيير سيرتيفياكت ومسارات المفتاح الخاص، وإضافة بعض المزيد من مخرجات التصحيح، ...) وفي العميل أنا فقط إزالة "بيو * خارج" وطباعة النتيجة BIO_read إلى وحدة التحكم بدلا من ذلك . كما يستخدم كل من العميل والخادم TLSv1_1_client_method و TLSv1_1_server_method على التوالي.

تعمل الرموز بشكل جيد معا، ولكن إذا أضفت "BIO_set_nbio (ويب، 1)؛" إلى العميل قبل BIO_do_connect، الاتصال لا يعمل بعد الآن. يعود BIO_do_connect -1. هل يمكن أن يكون هذا مشكلة المصافحة وإذا كان الأمر كذلك، كيف يمكنني المصافحة بشكل صحيح مع مآخذ غير عرقلة؟

حدث هذا الخطأ لأول مرة في مشروع أكبر من الألغام. لقد استخدمت للتو رموز المثال للتحقق منها. مشكلتي هي، أحتاج إلى مآخذ غير حظر، لأنني استدعاء BIO_read من مؤشر ترابط مختلف ولا أستطيع الانضمام إلى مؤشر الترابط إذا كان عالقا في محاولة للقراءة.

حاولت أيضا تعيين المقبس لعدم حظر باستخدام fd_set وحدد، ولكن هذا يلقي الخطأ وسينوتسك (10038). فعلت ما يلي:

الرأس:

BIO* _bio;
SSL* _ssl;
FD_SET _fdSet;
SOCKET _socket;
timeval t;

على الاتصال:

_bio = BIO_new_ssl_connect(_ctx);
BIO_get_ssl(_bio, &_ssl);
SSL_set_mode(_ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(_bio, _address); // _address is "hostname:port"
int connectResult = BIO_do_connect(_bio);

// ... error handling for connect, certificate verification

BIO_get_fd(_bio, _socket);
FD_ZERO(&_fdSet);
FD_SET(_socket, &_fdSet);
t.tv_sec = 2;
t.tv_usec = 0;

في مؤشر الترابط الذي استطلاعات المقبس:

int selectResult = select(0, &fdSet, NULL, NULL, &t); // <-- throws WSAENOTSOCK
if (selectResult > 0)
    x = BIO_read(_bio, &buf, 1);

هل حدد حتى قابلة للتنفيذ إذا كان لديك مقبس بيو؟

العميل على ويندوز 7 64 بت، يعمل الخادم على أوبونتو 64 بت على فم على نفس المضيف ويندوز 7.





nonblocking