Socket传输图片为什么分步可以,直接运行总是会出错?

lied 2015-09-08 11:26:10
由于要传输图片、消息,和txt,所以在OnRead中对第一个字节判断,得到类型后,执行相应的操作。单步调试可以,直接运行的时候貌似在if(tag==0)
{
char buf;
int leng1,leng2;
leng1=Socket->ReceiveLength();//
Socket->ReceiveBuf(&buf,1);
tag=StrToInt(buf);
leng2=Socket->ReceiveLength();//不是这次读剩下的,而是整个缓冲区剩下的

//free(buf);
}
这部分的出错。。。 代码如下:
if(tag==0)
{
char buf;
int leng1,leng2;
leng1=Socket->ReceiveLength();//
Socket->ReceiveBuf(&buf,1);
tag=StrToInt(buf);
leng2=Socket->ReceiveLength();//不是这次读剩下的,而是整个缓冲区剩下的

//free(buf);
}
/*消息接收部分代码,这里是正确的
else if(tag==1)
{
int pos1,pos2,leng;
AnsiString s,txt,color,size;
leng=Socket->ReceiveLength(); // 虽然第二次进来,但是其和leng2一样大
s=Socket->ReceiveText();

pos1=s.Pos(';');
color=s.SubString(1,pos1-1);
pos2=s.Pos('/');
size=s.SubString(pos1+1,pos2-pos1-1);
if(color=="Red")
{
RichEdit2->Font->Color=clRed;
}
if(color=="Green")
{
RichEdit2->Font->Color=clGreen;
}
if(color=="Blue")
{
RichEdit2->Font->Color=clBlue;
}
RichEdit2->Font->Size=StrToInt(size);
RichEdit2->Text=s.SubString(pos2+1,leng);
tag=0;
}
*/
/*图片接收*/
else
{

int rleng;
rleng=Socket->ReceiveLength();

if(rleng!=0)
{
char *buf2=new char[rleng];
Socket->ReceiveBuf(buf2,rleng);
receiveStream->Write(buf2,rleng);
rleng=Socket->ReceiveLength();
if(rleng==0) //接收完成
{
receiveStream->Position=0;
AnsiString path; // 应用程序路径
path=ExtractFilePath(Application->ExeName);
receiveStream->SaveToFile(""+path+"\\temp.jpeg");
Memo1->Text="图片保存在当前目录下,点击预览";
tag=0;
}
}

}
}
...全文
110 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lied 2015-09-11
  • 打赏
  • 举报
回复
引用 2 楼 kfrght 的回复:
tag=StrToInt(buf);这里是否应该使用tag=StrToInt(buf[0]);这样
恩恩,这个应该要改谢谢。 还有疑问,就是如果client端连续send两次,每次内容都很小(总大小不超过接收缓存8192),那么接收端 是会触发一次onread,还是会触发两次? 如果触发两次,会不会出现都在执行OnRead事件,产生一些错误,比如,全局变量的使用上。 您可以帮忙解释下么? 谢谢!
宝龙哥 2015-09-08
  • 打赏
  • 举报
回复
tag=StrToInt(buf);这里是否应该使用tag=StrToInt(buf[0]);这样
lied 2015-09-08
  • 打赏
  • 举报
回复
引用 楼主 u010412073 的回复:
由于要传输图片、消息,和txt,所以在OnRead中对第一个字节判断,得到类型后,执行相应的操作。单步调试可以,直接运行的时候貌似在if(tag==0) { char buf; int leng1,leng2; leng1=Socket->ReceiveLength();// Socket->ReceiveBuf(&buf,1); tag=StrToInt(buf); leng2=Socket->ReceiveLength();//不是这次读剩下的,而是整个缓冲区剩下的 //free(buf); } 这部分的出错。。。 代码如下:
if(tag==0)
{
char buf;
int leng1,leng2;
leng1=Socket->ReceiveLength();//
Socket->ReceiveBuf(&buf,1);
tag=StrToInt(buf);
leng2=Socket->ReceiveLength();//不是这次读剩下的,而是整个缓冲区剩下的

//free(buf);
}
/*消息接收部分代码,这里是正确的
else if(tag==1)
{
int pos1,pos2,leng;
AnsiString s,txt,color,size;
leng=Socket->ReceiveLength(); // 虽然第二次进来,但是其和leng2一样大
s=Socket->ReceiveText();

pos1=s.Pos(';');
color=s.SubString(1,pos1-1);
pos2=s.Pos('/');
size=s.SubString(pos1+1,pos2-pos1-1);
if(color=="Red")
{
RichEdit2->Font->Color=clRed;
}
if(color=="Green")
{
RichEdit2->Font->Color=clGreen;
}
if(color=="Blue")
{
RichEdit2->Font->Color=clBlue;
}
RichEdit2->Font->Size=StrToInt(size);
RichEdit2->Text=s.SubString(pos2+1,leng);
tag=0;
}
*/
/*图片接收*/
else
{

int rleng;
rleng=Socket->ReceiveLength();

if(rleng!=0) 
{
char *buf2=new char[rleng];
Socket->ReceiveBuf(buf2,rleng);
receiveStream->Write(buf2,rleng);
rleng=Socket->ReceiveLength();
if(rleng==0)  //接收完成
{
receiveStream->Position=0;
AnsiString path;  // 应用程序路径
path=ExtractFilePath(Application->ExeName);
receiveStream->SaveToFile(""+path+"\\temp.jpeg");
Memo1->Text="图片保存在当前目录下,点击预览";
tag=0;
}
}

}
}
tag在窗口建立时初始化为0,发送端发送的内容的第一个字节,用1,2,3,4表示不同类型

1,317

社区成员

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

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