質問

だからここUTDメッセージを受信するための私のプログラムです。私は、WiFi経由で640枚の* 480 YUV画像を受信するためにそれを使用することを計画しています。私はどのくらいの大きさのバッファを設定する必要がありますか?それは実際のサイズを見つけるために最初の画像を受信した後、集合バッファには可能ですか?

ベローは私の全体のコードですが、基本的に私の質問は、このラインに関連しています:

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;
}
役に立ちましたか?

解決

memsetは、メモリの一部に書き込み、それを割り当てません。あなたは確かに画像を受信した後、それを呼び出すことができますが、それはsin_zeroのアドレスから始まるメモリの8つのバイトを拭くの効果を持つことになります。

のメモリを割り当てますおそらく、あなたの平均malloc、しかしは、メモリー不足の問題を検出するためにリークし、nullチェックを防ぐためにfreeを使用する必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top