سؤال

أحاول إنشاء عميل يجب أن يتصل بخادم C.لا بد لي من استخدام TCP.لدي بالفعل خادم يعمل بكامل طاقته، ولكن لا يمكنني الاتصال بالعميل الخاص بي.لا أريد إرسال أي بيانات إلى الخادم (في هذه المرحلة).أريد فقط إنشاء اتصال وفتح مربع حوار جديد.

إليك الرمز الموجود في فتحة Void Login::on_pushButton_clicked().// PushButon هو زر تسجيل الدخول الخاص بي

pSocket = new QTcpSocket (this);
connect (pSocket, SIGNAL(readyRead()), SLOT(waitNextStep()));
pSocket->connectToHost(ui->lineEdit->text(), ui->lineEdit_2->text().toInt());
if(pSocket->waitForConnected())
{
    Menu mMenu;
    mMenu.setModal(true);
    mMenu.exec();
}
else
{
    QMessageBox::critical(this,tr("Error"),tr("Error at Connect"));
}

لقد قمت بالفعل بتعريف فئة القائمة وأعلم أنها فعالة منذ أن قمت باختبارها بدون جزء الاتصال.جزء جلب IP من lineEdits يعمل أيضًا.تم الإعلان عن pSocket في فئة تسجيل الدخول كعضو خاص (QTcpSocket *pSocket;).

لسوء الحظ، أنا جديد على QT ولا أعرف حقًا ما الذي يجب أن تحتويه وظيفة "waitNextStep()".لقد قمت للتو بإرجاع 1;لست متأكدًا من الفتحة الموجودة في وظيفة الاتصال حيث لاحظت في العديد من الأمثلة وجود وظائف مختلفة هناك.

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

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

المحلول

لسوء الحظ، أنا جديد على QT ولا أعرف حقًا ما الذي يجب أن تحتويه وظيفة "waitNextStep()".لقد قمت للتو بإرجاع 1;لست متأكدًا من الفتحة الموجودة في وظيفة الاتصال حيث لاحظت في العديد من الأمثلة وجود وظائف مختلفة هناك.

يعتمد الأمر بشكل كبير على حالة الاستخدام الخاصة بك، ولكن عادةً ما يكون هذا هو معالج البيانات الواردة مهما كنت ترغب في القيام بها، بما في ذلك أنك تقوم فقط بتخزينها في متغير عضو في الوقت الحالي.

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

هذا بسبب if(pSocket->waitForConnected()) هو الحظر (أي.sync) استخدام عملية Qt غير المتزامنة.ما أقترح القيام به بدلاً من ذلك هو الاتصال بالإشارة المتصلة وفقًا لذلك توثيق:

باطلة QAbstractSocket::connected() [إشارة]

تنبعث هذه الإشارة بعد استدعاء ConnectToHost() وتم إنشاء الاتصال بنجاح.

ملحوظة:في بعض أنظمة التشغيل، قد يتم إصدار الإشارة المتصلة () مباشرة من استدعاء ConnectToHost () للاتصالات بالمضيف المحلي.

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