Question

Voici donc mon programme pour recevoir des messages de UTD. Je prévois de l'utiliser pour recevoir 640 * 480 images YUV sur wifi. Quelle est la taille du tampon dois-je mettre? Est-il possible de tampon ensemble après avoir reçu la première image pour connaître la taille réelle?

Bellow est mon code entier, mais essentiellement ma question est liée à cette ligne:

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

Et si elle peut être réglée après avoir obtenu la première image.

#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;
}
Était-ce utile?

La solution

memset écrit à une partie de la mémoire, il ne lui attribue pas. Vous pouvez certainement l'appeler après avoir reçu une image, mais elle aura pour effet d'effacer 8 octets de mémoire à partir de l'adresse de sin_zero.

Peut-être vous malloc moyenne, qui allouer de la mémoire, mais nécessite l'utilisation de free pour éviter les fuites et Null contrôles pour détecter hors mémoire problèmes.

Je suggère également d'utiliser C ++ pur plutôt que le mélange de C et les fonctions C de vous utilisez ici. Cela signifierait en utilisant new et probablement un pointeur intelligent au lieu de malloc et free. Vous pouvez également trouver quelque chose d'utilisation dans les bibliothèques Boost si le TSL n'a pas ce que vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top