سؤال

هذا يرسل البيانات مرة واحدة فقط والتي تبدو غير عقلانية بالنسبة لي كما هي في حلقة:

char* hello;
for (int i = 0; i < 10; i++) {

    hello = "Hello world!\n";
    if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0))
    {
        cout << "send: " << UDT::getlasterror().getErrorMessage();
    }

}

ألا يجب أن ترسل البيانات 10 مرات؟ أنا لا أفهم ذلك. هنا البرنامج بأكمله (إنه قصير جدًا):

int main()
{
    UDTSOCKET client;
    sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(9000);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
    memset(&(serv_addr.sin_zero), '\0', 8);

    client = UDT::socket(AF_INET, SOCK_STREAM, 0);

    // connect to the server, implict bind
    if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr)))
    {
        cout << "connect: " << UDT::getlasterror().getErrorMessage();
    }

    char* hello;
    for (int i = 0; i < 10; i++) {

        hello = "Hello world!\n";

        if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0))
        {
            cout << "send: " << UDT::getlasterror().getErrorMessage();
        }

    }

    UDT::close(client);

    system("pause");
}
هل كانت مفيدة؟

المحلول

هل راجعت رمز جانب الخادم. يقوم العميل بإرساله في حلقة ، كيف يستقبلها جانب الخادم؟

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

while (true)
{
  UDTSOCKET recver = UDT::accept(serv, (sockaddr*)&their_addr, &namelen);

  cout << "new connection: " << inet_ntoa(their_addr.sin_addr) << ":" << ntohs(their_addr.sin_port) << endl;

  if (UDT::ERROR == UDT::recv(recver, data, 100, 0))
  {
    cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl;
    //return 0;
  }
....................
....................
}

نصائح أخرى

هل تمر عبر الحلقة 10 مرات ، أو تمر فقط من خلال الحلقة مرة واحدة؟

لست على دراية بالمكتبة التي تستخدمها ، لكنني لم أر أي نوع من flush أمر. إذا مرت الحلقة 10 مرات ولكنها ترسل البيانات مرة واحدة فقط ، فقد تحتاج إلى التدفق.

بنية العميل والخادم لا يتطابق.

يرسل العميل 10 مرات داخل اتصال واحد. يقبل الخادم 10 اتصالات ويقرأ وقت واحد فقط داخل كل واحد.

من الواضح أن كل اتصال سيملة إلى حاوية. يتم التخلص من البيانات المرسلة ولكن لا تقرأ بعد إغلاق الاتصال و (بالطبع) لا يمكن الوصول إليها من الاتصالات الأخرى.

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