Pregunta

Así que aquí es mi programa para recibir mensajes de UTD. Tengo la intención de usarlo para recibir 640 * 480 imágenes YUV a través de WiFi. ¿Qué tan grande tampón debe establecer que? ¿Es posible de autonomía ajustado después de recibir la primera imagen para averiguar el tamaño real?

Fuelle es toda mi código, pero básicamente mi pregunta está relacionada con esta línea:

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

Y si se puede ajustar después de recibir la primera imagen.

#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;
}
¿Fue útil?

Solución

memset escribe a una parte de la memoria, que no asigna la misma. Por supuesto que puede llamar a él después de recibir una imagen, pero tendrá el efecto de borrar 8 bytes de memoria a partir de la dirección de sin_zero.

Tal vez malloc media, lo que asignar memoria, pero requiere el uso de free para evitar fugas y nulos controles para detectar fuera de la memoria problemas.

Yo sugeriría también usando C ++ puro en lugar de la mezcla de C y C ++ funciones está utilizando aquí. Esto significaría usar new y probablemente un puntero inteligente en lugar de malloc y free. También puede encontrar algo de su uso en las bibliotecas Boost si el STL no tiene lo que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top