来者有分,如何用SendBuf/ReceiveBuf发送和接收图片,请留例题!

sam200401 2003-02-19 09:27:37
来者有分,如何用SendBuf/ReceiveBuf发送和接收图片,请留例题!详细点
...全文
99 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sam200401 2003-02-19
  • 打赏
  • 举报
回复
我水平太低了,还是留例题直观点,请大虾帮忙啊!
l_clove 2003-02-19
  • 打赏
  • 举报
回复
直接要代码不好,你要是遇到了什么问题,兄弟们可以帮你解决
SendBuf和ReceiveBuf是很简单的,定义了缓冲就可以用了,把收到的数据写到文件里就行了
halibut 2003-02-19
  • 打赏
  • 举报
回复
UP!
sam200401 2003-02-19
  • 打赏
  • 举报
回复
bool WaitForData(int socket)
{
TFDSet FDSet;
TTimeVal TimeVal = {1000, 0};
FD_ZERO(FDSet);
FD_SET(socket, FDSet);
return (select(0, &FDSet, NULL, NULL, &TimeVal) > 0);
}
可不可以解释一下(我也很不好意思,真的是水平有限)
fancy_zhh 2003-02-19
  • 打赏
  • 举报
回复
只需要将文件转换成一个流Stream,然后不就可以直接用了
copy_paste 2003-02-19
  • 打赏
  • 举报
回复
我随手写的,我只是提供个思路。我也不知道你怎么处理的。

Socket->ReceiveBuf时,检查它的返回值,如:

int ret = Socket->ReceiveBuf(&count, sizeof(count));
if (sizeof(count) <> ret)
throw ESocketError("接受数据出错。");

其它的也是这样。最好在SendBuf中也这样操作。

还有就是在Recv时,进行等待数据到来,有时候,数据的传输会延迟,所以最好做个WaitForData;

bool WaitForData(int socket)
{
TFDSet FDSet;
TTimeVal TimeVal = {1000, 0};
FD_ZERO(FDSet);
FD_SET(socket, FDSet);
return (select(0, &FDSet, NULL, NULL, &TimeVal) > 0);
}


if (!WaitForData(Socket->SocketHandle));
throw ESocketError("没有数据到来");
Socket->ReciveBuf(&count, sizeof(count));


while (count > 0)
{
if (!WaitForData(Socket->SocketHandle)) continue;
int ret = Socket->ReceiveBuf((void*)buffer, sizeof(buffer));
Stream->WriteBuffer(buffer, ret);
count -= ret;
}
sam200401 2003-02-19
  • 打赏
  • 举报
回复
copy_paste(木石三) :
你的例题修改后测试后发现图不能传送 :
count=0
保存后的文件0为字节!
请你修改下再贴,十二万分感谢!
christopher_hp 2003-02-19
  • 打赏
  • 举报
回复
先用SaveToStream()把图片转为FileStream
然后用SendStream发,
接受先接受长度ReceiveLength()
然后ReceiveBuf()收,收的时候先用TMemoryStream申明一块内存,然后接受完后SaveToFile()
copy_paste 2003-02-19
  • 打赏
  • 举报
回复
大概是这样吧:
const
command_picture = 0x01;

send:
TMemoryStream *Stream = TMemoryStream;
Stream->LoadFromFile("mypicture");
int command = command_picture, count = Stream->Size;

TCustomWinSocket *Socket = ClientSocket1->Socket;
Socket->SendBuf(&command, sizeof(command));
Socket->SendBuf(&count, sizeof(count));
Socket->SendBuf((void*)Stream->Memory, count);
delete Stream;

recv:
int command, count;
Socket->RecieveBuf(&command, sizeof(command));
if (command == command_picture)
{
Socket->ReciveBuf(&count, sizeof(command));
TMemoryStream *Stream = new TMemoryStream;
BYTE buffer[4096];
while (count > 0)
{
int ret = Socket->ReceiveBuf((void*)buffer, sizeof(buffer));
Stream->WriteBuffer(buffer, ret);
count -= ret;
}
Stream->SaveToFile("mypicture");
delete Stream;
}
Jonix 2003-02-19
  • 打赏
  • 举报
回复
我以前作过,你碰到什么问题了??

我发送数据流之前先发一串表示数据量长度的字串,对方收到后,就开始收数据流,一直等到收全了才完成。
sam200401 2003-02-19
  • 打赏
  • 举报
回复
在线等,请帮忙!

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧