如何通过套接字发送存储在流中的图像?

时间:2012-12-04 12:08:15

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

如何通过套接字连接在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”而不是“myStreamR”,我会得到它,它是从原始流中读取的char数组构造的。

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

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

1 个答案:

答案 0 :(得分:0)

正如Joachim Pileborg和Zane指出的那样,使用Read和Write确实是正确的方法。

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

示例:

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