【问题标题】:How do I send an image stored in a stream through a socket?如何通过套接字发送存储在流中的图像?
【发布时间】:2012-12-04 12:08:15
【问题描述】:

如何通过套接字连接在 IStream 接口中发送使用 GdipSaveImageToStream() 存储的图像?

send() 函数需要一个 char 数组,但我不知道如何将 IStream 中的数据提取到一个 char 数组中。

使用 memcpy() 会是个好主意吗?将数据存储在 char 数组中并在另一端重构流?

[编辑]

我尝试使用 read 但我遗漏了一些东西。

//stream to char array, to send
STATSTG myStreamStats;
ULONG bytesSaved;
myStream->Stat(&myStreamStats, 0);
char* streamData = new char[myStreamStats.cbSize.QuadPart];
if(myStream->Read(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
    cout<<"OK!"<<endl;
else
    cout<<"Not OK!"<<endl;

//char array to stream, to save
if(myStreamR->Write(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
    cout<<"OK!"<<endl;
else
    cout<<"Not OK!"<<endl;

myImage = Image::FromStream(myStreamR);
myImage->Save(lpszFilename, &imageCLSID, NULL);

[注1:]程序编译并运行,但我没有得到我的图像。如果我使用原始的“myStream”而不是使用从原始流中读取的 char 数组构造的“myStreamR”,我会得到它。

[Note2:] 输出是两个“OK!”,这意味着所有字节都被复制到数组中,并且都被粘贴到新的流中。但是,我检查了 savedBytes,我发现在 read() 之后它是 0(不好),而在 write() 之后它等于我给的流大小。那为什么如果什么都没有读取,为什么 read() 会给我一个“S_OK”标志?

[注3:]我遗漏了一些东西。

【问题讨论】:

  • Joachim 已经为您指明了方向 - 您需要将数据从流复制到套接字,即从一个读取,写入另一个。

标签: c++ windows visual-studio sockets istream


【解决方案1】:

正如 Joachim Pileborg 和 Zane 所指出的,使用读写确实是正确的方法。

但是,请记住,每次使用流时,seek 光标都会改变位置,因此在 Read 之前和 Write 之前,使用 Seek 方法将光标返回到流的开头。

例子:

LARGE_INTEGER li;
li.QuadPart = 0;
myStream->Seek(li, STREAM_SEEK_SET, NULL);

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 2012-08-17
    • 2013-12-31
    • 1970-01-01
    • 2014-09-25
    • 2013-03-24
    • 2016-04-14
    相关资源
    最近更新 更多