2017-04-04 38 views
1

現在、TCPを介してC++クライアントとC#サーバー間でjpegピクチャのストリームを送信しようとしています。 C++側ではtransmitFile関数を使用していますが、C#側で正しく処理しているかどうかはわかりません。 私はランタイムエラーを取得しませんが、画像が表示されないので、私は何かが不足していると思います。TCP経由でC++クライアント/ C#サーバー間でファイルを送信する

EDIT:更新されたコード、私はstackoverflowのをやっている受信てるファイルサイズ...

C++コード(クライアント:送信絵)

void TCPclient::sendPicture(LPCWSTR filename, std::string filename_str) 
{ 
    HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); 
    //Send file size 
    send(sock, (const char*)GetSize(filename_str), sizeof(int), 0); 
    LogManager::log(std::to_string(GetSize(filename_str))); 
    //Send file 
    TransmitFile(sock, hFile, GetFileSize(hFile, NULL), 1024, NULL, NULL, TF_USE_KERNEL_APC | TF_WRITE_BEHIND); 
    CloseHandle(hFile); 
} 

int TCPclient::GetSize(std::string filename) 
{ 
    struct stat stat_buf; 
    int rc = stat(filename.c_str(), &stat_buf); 
    return rc == 0 ? stat_buf.st_size : -1; 
} 

C#コード(サーバー:画像を受信し、それを表示する)

while (true) 
     { 
      try 
      { 
       using (MemoryStream stream = new MemoryStream(ReceiveVarData(clientSock))) 
       { 
        stream.Position = 0; 
        Image image = Image.FromStream(stream); 
        if (image != null) 
         pictureBox1.Image = image; 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 
     } 

    public static byte[] ReceiveVarData(Socket s) 
    { 
     Console.WriteLine("Receiving data ..."); 
     int offset = 0; 
     int recv; 
     Console.WriteLine("Receiving data size ..."); 
     byte[] datasize = new byte[4]; 
     s.Receive(datasize); 
     int size = BitConverter.ToInt32(datasize, 0); 
     Console.WriteLine("Data size " + size); 
     byte[] data = new byte[size]; 
     while (offset < size) 
     { 
      Console.WriteLine("Downloading " + (offset/size)*100.0 + "%"); 
      recv = s.Receive(data, offset, 1024, SocketFlags.None); 
      if (recv == 0) 
      { 
       data = null; 
       break; 
      } 
      offset += recv; 
     } 
     return data; 
    } 
+0

ファイルサイズは読んでいますが、ファイルサイズの送信先はわかりません。 –

答えて

1

変更:

using (Image image = Image.FromStream(new MemoryStream(ReceiveVarData(clientSock)))) 
{ 
    if (image != null) 
     pictureBox1.Image = image; 
} 
これに

using (MemoryStream stream = new MemoryStream(ReceiveVarData(clientSock))) 
{ 
    stream.Position = 0; 
    Image image = Image.FromStream(stream); 
    if (image != null) 
     pictureBox1.Image = image; 
} 

あなたはそれを作成した後、あなたのImageオブジェクトの権利を配置しています。
MemoryStreamを(私が覚えている)データバッファでインスタンス化すると、そのストリームの最後に位置が設定されるので、MemoryStream.Positionを最初に戻さなければなりません。

+0

MemoryStreamを破棄するのはかなり厄介なバグです。残念なことに、頻繁に例外が発生することはありません。 –

+0

コードを更新しましたが、C#側でファイルサイズを読み込もうとすると、stackoverflowエラーが発生します.... – Germain

+0

@ Germain67ファイルサイズを送信せずに同じことを試してください。私が覚えているところでは、 'TransmitFile'はまずファイルサイズを送信し、次にファイルの内容を送信します。これは誤っているかもしれないが、試す価値がある。 –

関連する問題