2010-11-20 5 views
0

UTDメッセージを受信するプログラムはここにあります。私はそれを使用して、WiFiで640 * 480のYUV画像を受信する予定です。どのくらいのバッファを設定する必要がありますか?実際のサイズを見つけるために最初のイメージを受け取った後にバッファを設定することは可能ですか?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は、メモリの一部に書き込みますが、割り当てません。イメージを受け取った後は必ずそれを呼び出すことができますが、sin_zeroのアドレスから8バイトのメモリを消去するという効果があります。

おそらくメモリを割り当てるが、メモリ外の問題を検出するためにリークやヌルチェックを防ぐためにはfreeを使用する必要があります。

私は純粋なC++のではなく、あなたがここで使用しているCおよびC++の機能の組み合わせを使用してもお勧めします。これはmallocfreeの代わりにnewとおそらくスマートポインタを使用することを意味します。もしstlに必要なものがなければ、Boostライブラリに何か役に立つものがあるかもしれません。

関連する問題