Frage

So, hier ist mein Programm UTD-Nachrichten für den Empfang. Ich plane, es zu benutzen, 640 * 480 YUV Bilder über WLAN zu empfangen. Wie groß Puffer sollte ich? Ist es möglich, Satz Puffer nach dem ersten Bildaufnahme die tatsächliche Größe, um herauszufinden?

Bellow ist mein ganzer Code, aber im Grunde ist meine Frage an diese Linie bezogen werden:

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

Und ob es kann nach dem Aufstehen ersten Bild eingestellt werden.

#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;
}
War es hilfreich?

Lösung

memset schreibt auf einen Teil des Speichers, ist es nicht zuordnen. Sie können es auf jeden Fall rufen nach Empfangen eines Bildes, aber es wird die Wirkung des Wisch 8 Byte Speicher haben bei der Adresse des sin_zero starten.

Vielleicht haben Sie mittlere malloc, die Speicher zuweisen würde, aber die Verwendung von free erfordert Lecks und null-Kontrollen erkennen out-of-Speicherprobleme zu vermeiden.

Ich würde vorschlagen, auch reine C ++, anstatt die Mischung aus C und C ++ Funktionen hier Sie verwenden. Dies würde bedeuten, new verwenden und wahrscheinlich einen intelligenten Zeiger statt malloc und free. Sie können auch etwas von dem Einsatz in den Boost-Bibliotheken finden, wenn die stl hat nicht das, was Sie brauchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top