2010-11-20 4 views
0

Итак, вот моя программа для приема сообщений UTD. Я планирую использовать его для получения 640 * 480 изображений YUV через Wi-Fi. Какой должен быть большой буфер? Можно ли установить буфер после получения первого изображения, чтобы узнать фактический размер?Размер буфера сервера UDT?

пыльник весь мой код, но в основном мой вопрос связан с этой линией:

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

ответ

1

memset пишет в части памяти, она не выделяет его. Вы можете, конечно, вызвать его после получения изображения, но он будет иметь эффект вытирания 8 байтов памяти, начиная с адреса sin_zero.

Возможно, вы имеете в виду malloc, который будет выделять память, но для предотвращения утечек и отсутствия ошибок необходимо использовать free.

Я бы предложил также использовать чистый C++, а не сочетание функций C и C++, которые вы используете здесь. Это будет означать использование new и, вероятно, умный указатель вместо malloc и free. Вы также можете найти что-то полезное в библиотеках Boost, если stl не имеет того, что вам нужно.

Смежные вопросы