sznray 2015-09-09 03:14 采纳率: 0%
浏览 538

急!求大神帮忙!!从客户端传一张70M左右的图片到服务器!!调了几天没调出来!!

客户端:
Client->Active = true;
//Application->ProcessMessages();
ShowMessage("send");
TMemoryStream *pMS = new TMemoryStream();
f = new TStringList();
pMS->LoadFromFile(Edit1->Text);
int bmpsize = pMS->Size;
int count = bmpsize/(BUFSIZE-8);
int mod = bmpsize%(BUFSIZE-8);
int ret;
for(i=0;i {
memset(buf,'\0',sizeof(buf));
//包头
buf[0] = 0xFD;
buf[1] = 0xFD;
buf[2] = 0xFD;
buf[3] = 0xFD;
buf[4] = 0x00;
buf[5] = 0x0B;
//图片内容
pMS->ReadBuffer(buf+6,BUFSIZE-8);
//包尾
buf[BUFSIZE-2] = 0xFD;
buf[BUFSIZE-1] = 0x0D;
ret = Client->Socket->SendBuf(buf,BUFSIZE);
while(ret <= 0)
{
errcount++;
ret = Client->Socket->SendBuf(buf,BUFSIZE);
}
f->Add(ret);
Sleep(10);
}
//最后的不完整包
if(mod != 0)
{
memset(buf,'\0',sizeof(buf));
buf[0] = 0xFD;
buf[1] = 0xFD;
buf[2] = 0xFD;
buf[3] = 0xFD;
buf[4] = 0x00;
buf[5] = 0x0B;
pMS->ReadBuffer(buf+6,mod);
buf[6+mod] = 0xFD;
buf[7+mod] = 0x0B;
ret = Client->Socket->SendBuf(buf,mod+8);
while(ret <= 0)
{
errcount++;
ret = Client->Socket->SendBuf(buf,mod+8);
}
f->Add(mod);
f->SaveToFile("f:\send.txt");
}
f->Add(ret);

ShowMessage("发送完成");

delete pMS;
delete f;
Client->Active = false;

服务端:
if(0 == flag)
{
fd = fopen("F:\RAD2010\server\image\1.bmp","ab+");
flag = 1;
}
int datalen = Socket->ReceiveLength();
if(datalen >= RECSIZE)
size = RECSIZE;
else
size = datalen;
memset(buf,'\0',sizeof(buf));
int ret = Socket->ReceiveBuf(buf,size);
//判断是否含包头
if(buf[0] == 0xFD && buf[1] == 0xFD && buf[2] == 0xFD && buf[3] == 0xFD)
{
if(begin == 1)
{
memset(temp,'\0',sizeof(temp));
count = 0;
position = 0;
//ShowMessage("err");
}
begin = 1;
head = 6;
}
//判断是否含包尾
if((buf[ret-2] == 0xFD && buf[ret-1] == 0x0D) || (buf[ret-2] == 0xFD && buf[ret-1] == 0x0B))
{
memcpy(temp+position,buf+head,size-head-2);
count = count + size - head - 2;
//把temp中的内容写到文件里面
if(fwrite(temp,count,1,fd) == 1)
{
f->Add(count);
f->SaveToFile("f:\rec.txt");
memset(temp,'\0',sizeof(temp));
}
else
{
ShowMessage("error");
}
position = 0;
head = 0;
begin = 0;
//接收到最后一个包
if(buf[ret-2] == 0xFD && buf[ret-1] == 0x0B)
{
ShowMessage("接收成功");
fclose(fd);
flag = 0;
}
}
else
{
//把内容放到temp缓冲区Byte temp[110*1024]里面
memcpy(temp+position,buf+head,size-head);
position = position + ret - head;
count = count + size - head;
head = 0;
}

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-06-30 00:09
    关注

    该回答引用NewBing,仅供参考,不保证完全正确

    你好,这是必应。我可以尝试帮你解决客户端传图片到服务器的问题。😊


    根据我搜索的结果,你的客户端和服务器之间的图片传输可能有以下几种问题:

    • 你的客户端和服务器没有定义一个明确的通信协议,导致图片数据的分包、发送、接收和组包过程出现错误或不一致。你可以使用一些标准的协议或者自定义一个协议来规范你的图片数据的格式、大小、顺序、校验等信息,以便于客户端和服务器之间正确地传输和解析图片数据。
    • 你的客户端和服务器没有处理好 socket 的返回值,导致图片数据的发送或接收不完整或出现阻塞。你可以检查 socket 的返回值是否等于你期望发送或接收的字节数,如果不等于,你可以使用循环或递归的方式来继续发送或接收剩余的字节数,直到完成整个图片数据的传输。
    • 你的客户端和服务器没有考虑到网络延迟或丢包等异常情况,导致图片数据的传输失败或出现错误。你可以使用一些机制来保证图片数据的传输的可靠性和完整性,例如使用超时、重传、确认、校验等方法来处理网络异常情况。

    这里有一些有用的资源,可以帮助你更深入地了解 C++ 中的 socket 图片传输问题:

    希望这些信息能对你有所帮助!如果你还有其他问题,请随时问我。😊


    源: 与必应的对话, 2023/6/30
    (1) c/c++ socket通讯如何实现图片传输? - 知乎. https://www.zhihu.com/question/439407714.
    (2) Linux C/C++ TCP Socket传输文件或图片实例 - zkfopen - 博客园. https://www.cnblogs.com/zkfopen/p/9441797.html.
    (3) 如何用C++往远端服务器上传图片-CSDN社区. https://bbs.csdn.net/topics/391921876.

    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试