TCP接收文件出现接收错误,大家帮忙看看,谢谢!

Yluo_D 2011-06-29 10:56:13
废话不说,先上代码。
接收代码如下:

#pragma pack(1)
struct PICINFO
{
DWORD64 time;//日历时间*1000
//还有若干个char 和 int 和 bool。
int length;//图片文件长度
};
#pragma pack()
BOOL MySend(SOCKET sock,char * szme,int len)
{
int pos=0;
int rec=0;
try
{
while(pos < len)
{
rec=send(sock,szme+pos,len-pos,0);
if(rec <=0)return FALSE;
pos += rec;
}
}
catch (...)
{
return FALSE;
}

return TRUE;
}
BOOL MyRecv(SOCKET sock,char * szme,int len)
{
int pos=0;
int rec=0;
try
{
while(pos < len)
{
rec=recv(sock,szme+pos,len-pos,0);
if(rec <=0)return FALSE;
pos += rec;
}
}
catch (...)
{
return FALSE;
}
return TRUE;
}
UINT MainWorkThread(LPVOID pParam)//每一个连接对应一个线程
{
CXXXDlg * pThis=(XXXDlg *)pParam;
GETPIC * pgp=NULL;
SOCKADDR_IN client;
int iaddrSize = sizeof(SOCKADDR_IN);
int num=0;
int RecvTimeOut=60000;
int SendTimeOut=10000;
while(pThis->WorkThrRunning)
{
pThis->Sock= socket(AF_INET, SOCK_STREAM, 0);
setsockopt(pThis->Sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&SendTimeOut,sizeof(int));
setsockopt(pThis->Sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&RecvTimeOut,sizeof(int));
client.sin_addr.S_un.S_addr = inet_addr(pThis->IP);
client.sin_family = AF_INET;
client.sin_port = htons(MainThis->Port);
if(connect(pThis->Sock, (struct sockaddr *)&client, sizeof(SOCKADDR_IN))==0)
{
pThis->IsConnect=true;
int WRecvTO=0;
while(pThis->IsConnect)
{
num=-2;
if(!MyRecv(pThis->Sock,(char*)&num,4))
break;
switch(num)
{
case 0:
if(pgp==NULL)
{
pgp=new GETPIC;
pgp->next=NULL;
pgp->flag=0;
pgp->picinf=new PICINFO;
pgp->jpg=NULL;
pgp->img=NULL;
}
else
{
log.Format("图片接收异常,等待前端再次发送,IP is %s",pThis->IP);
MainThis->Savelog(2,log);
delete []pgp->jpg;
delete pgp->picinf;
delete pgp;
pgp=NULL;
goto MainWorkThreadIsNotConnect;
}
ZeroMemory(pgp->picinf,sizeof(PICINFO));
if(!MyRecv(pThis->Sock, (char *)pgp->picinf, sizeof(PICINFO)))
goto MainWorkThreadIsNotConnect;
if(pgp->picinf->length>0&&pgp->picinf->length<1024*1024)//发送端不可能出现1024*1024的图
{
pgp->jpg=new char[pgp->picinf->length];
ZeroMemory(pgp->jpg,pgp->picinf->length);
}
else goto MainWorkThreadIsNotConnect;
break;
case 1:
if(!MyRecv(pThis->Sock, pgp->jpg,pgp->picinf->length))
goto MainWorkThreadIsNotConnect;
pThis->lastpgp->next=pgp;
pThis->lastpgp=pgp;
pgp=NULL;
break;
default:
break;
}
}
MainWorkThreadIsNotConnect:
if(pThis->Sock!=NULL)closesocket(pThis->Sock);
pThis->Sock=NULL;
pThis->IsConnect=false;
}
else
{
if(pThis->Sock!=NULL)closesocket(pThis->Sock);
pThis->Sock=NULL;
pThis->IsConnect=false;
}
Sleep(5000);
}
if(pgp!=NULL)
{
if(pgp->jpg!=NULL)delete []pgp->jpg;
delete pgp->picinf;
delete pgp;
}
if(pThis->Sock!=NULL)closesocket(pThis->Sock);
pThis->Sock=NULL;
log.Format("MainWorkThread Stop,IP is %s\r\n",pThis->IP);
MainThis->Savelog(2,log);
pThis->IsConnect=false;
pThis->WorkThrEnd=TRUE;
return 11;
}

发送代码如下:

BOOL CSnapSocket::SendToServer(GETPIC * pgp)//发送GETPIC结点到服务器
{
int i=0;
if(!MySend(SendSock,(char*)&i,4))goto RETURNFALSE;
if(!MySend(SendSock,(char *)pgp->picinf,sizeof(PICINFO)))goto RETURNFALSE;
i=1;
if(!MySend(SendSock,(char*)&i,4))goto RETURNFALSE;
if(!MySend(SendSock,pgp->jpg,pgp->picinf->length))goto RETURNFALSE;
return TRUE;
RETURNFALSE:
TimeThrRunning=false;
closesocket(SendSock);
SendSock=NULL;
SendOrSave=false;
return FALSE;
}
//心跳30s一次 不会和上面的发送代码同时进行发送。
int sendflag=-1;
if(!MySend(pThis->SendSock,(char*)&sendflag,sizeof(int)))//发送符号,用来保持连接
{
pThis->TempThrRunning=false;
closesocket(pThis->SendSock);
pThis->SendSock=NULL;
SendOrSave=false;
}

错误现象:
程序接收端采用了一个switch,发送端会不定时的发送不定量信息到接收端,发送时的标示位为0 1交替进行,不知道为啥接收端会出现接收到连续两个0标示位的情况。我传输的都是不到500k的jpg图片,大家忙帮看看。。。是不是我的逻辑太混乱了造成的传输错误。。麻烦了~谢谢!
...全文
126 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yluo_D 2011-07-05
  • 打赏
  • 举报
回复
无解结贴。待研究后自答。
Yluo_D 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yynetsdk 的回复:]

给数据包打上顺序标记,组合的时候根据顺序来,因此要有个队列。
[/Quote]
其实发送的时候是按照一个头一个文件的顺序发送,且只有这一个发送端。接收端还需要排序么?

PS:传送结构体不会出现什么不可预料的情况吧,传头的时候没有做序列化,直接给结构体pack(1)然后扔出来的。
yynetsdk 2011-06-30
  • 打赏
  • 举报
回复
给数据包打上顺序标记,组合的时候根据顺序来,因此要有个队列。
Yluo_D 2011-06-30
  • 打赏
  • 举报
回复
求解啊。。能帮的帮一下呗,谢。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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