سؤال

أنا أكتب مكتبة عميل Telnet بسيطة. أفتح المقابس باستخدام fsockopen () وقراءة والكتابة إلى المقبس باستخدام fgetc () و fwrite (). يمكنني استخدام FGETC () بدلا من FREAD () للتعامل مع أوامر وخيارات Telnet الخاصة مثل (IAC، ...).

المشكلة هي أنه في معظم المرات التي أقرأها من المقبس، فإنها تستغرق وقتا طويلا للعودة. كما أنني قد لمزعها، فإنه يتطلب الأمر طالما أوقات الاتصال، وبعد ذلك لدي النتائج.

فيما يلي طريقة القراءة الخاصة بي:

protected function getChar()
{
    $char = fgetc( $this->_socket );
    return $char;
} // public function getChar()

حاليا أستخدم هذا الشرط للتأكد من الانتهاء من الدفق:

$char = $this->getChar();
if ( $char === false ) {
    // end of the stream.
}

هل هناك أي طريقة أخرى لمعرفة أن الدفق يتم الانتهاء من قراءة جميع البيانات؟

Udate: أعتقد أن حرف EOF في بروتوكول Telnet ليس ما تتوقعه PHP كإلكترونية، ولهذا السبب لا يمكن أن يجد البرنامج النصي نهاية الدفق. هل يعرف أي شخص ما هو حرف EOF (نهاية الملف) في بروتوكول Telnet؟

هل كانت مفيدة؟

المحلول

حاول صدى قيم سداسي عشرية لكل حرف تتلقاها. يجب أن تكون قادرا على رؤية ما تتلقىه مثل EOF، حتى لو كان PHP لا يتعرف عليه على هذا النحو. تفحص أورد () و BIN2HEX ()

نصائح أخرى

هنالك ويف() قد يكون ذلك مفيدا.

لقد بحثت ولم أجد أي شيء مفيد. ثم حاولت معرفة ما يفعله Telnetlib في Python لهذه المشكلة (أنا فقط أتعلم بيثون)، وقد اكتشفت أنه حتى مكتبة Python لا تبحث عن EOF. إنه فقط يحتفظ بقراءة الدفق حتى يتم تشغيله، أو يمر وقت معين من الوقت، أو البحث عن سلسلة خاصة بإرجاع نتيجة. لذلك أنا استخدمت نفس الطريقة لقراءة وحل مشكلتي. شكرا لجميع الإجابات والتعليقات. سأحاول إقناع شركتي بتوزيع مكتبة Telnet هذه بترخيص متوافق مع مصدر مفتوح. إذا حدث هذا، فسوف أقوم بالتحديث هنا.

Telnet ليس لديه نهاية رمز تيار (char). يرسل فقط المطالبة والتوقف عن الإرسال. وبالتالي فإن أفضل طريقة هي فخ تيار الإخراج الخاص بك في النص الفوري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top