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