سؤال

لذلك هنا هو برنامجي لاستلام رسائل UTD. أخطط لاستخدامه لتلقي 640*480 YUV على WiFi. ما هو حجم المخزن المؤقت الكبير الذي يجب أن أقوم به؟ هل من الممكن تعيين المخزن المؤقت بعد تلقي الصورة الأولى لمعرفة الحجم الفعلي؟

Bellow هو رمز كامل الخاص بي ولكن سؤالي يرتبط هذا السطر بشكل أساسي:

memset(&(my_addr.sin_zero), '\0', 8);

وما إذا كان يمكن تعيينها بعد الحصول على الصورة الأولى.

#ifndef WIN32
   #include <unistd.h>
   #include <cstdlib>
   #include <cstring>
   #include <netdb.h>
   #include <stdlib.h>
#else
   #include <winsock2.h>
   #include <ws2tcpip.h>
   #include <wspiapi.h>
#endif
#include <iostream>
#include <udt.h>
#include "cc.h"
#include <stdio.h>
#include <time.h>

using namespace std;

int main()
{
    UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, 0);

    sockaddr_in my_addr;
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(9000);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    memset(&(my_addr.sin_zero), '\0', 8);

    if (UDT::ERROR == UDT::bind(serv, (sockaddr*)&my_addr, sizeof(my_addr)))
    {
      cout << "bind: " << UDT::getlasterror().getErrorMessage();
      //return 0;
    }

    UDT::listen(serv, 10);

    int namelen;
    sockaddr_in their_addr;

    char ip[16];
    char data[350000];
    char* temp;
    FILE *log = fopen("UDT_log.txt", "at");
    time_t rawtime;
    struct tm * timeinfo;
    int k = 0;
    FILE *img;
    char filename[32];

    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;
        }

        time ( &rawtime );
        timeinfo = localtime ( &rawtime );
        temp = asctime(timeinfo);
        fwrite (temp, 1, strlen(temp) , log);
        fwrite ("\n", 1, 1 , log);

        sprintf (filename, "img%d.txt", k);
        img = fopen(filename, "wb");
        fwrite (data, 1, strlen(data) , img);
        fclose(img);

        UDT::close(recver);

        k++;
    }

    fclose(log);

    UDT::close(serv);

    //return 1;
}
هل كانت مفيدة؟

المحلول

memset يكتب إلى جزء من الذاكرة ، فهو لا يخصصها. يمكنك بالتأكيد تسميتها بعد تلقي صورة ، ولكن سيكون لها تأثير مسح 8 بايت للذاكرة بدءًا من عنوان Sin_zero.

ربما تقصد malloc, والتي من شأنها تخصيص الذاكرة ، ولكنها تتطلب استخدام free لمنع التسريبات والكشفات الخالية من الكشف عن القضايا خارج الذاكرة.

أود أن أقترح أيضًا استخدام C ++ النقي بدلاً من مزيج وظائف C و C ++ التي تستخدمها هنا. هذا يعني استخدام new وربما مؤشر ذكي بدلاً من malloc و free. يمكنك أيضًا العثور على شيء من الاستخدام في مكتبات Boost إذا لم يكن لدى STL ما تحتاجه.

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