+ -
当前位置:首页 → 问答吧 → 关于SOCKET丢包的问题

关于SOCKET丢包的问题

时间:2011-12-06

来源:互联网

我在使用socket传送大文件大概3M多的时候分了787个包,通过日志发现确实发送了787个包,但是接收的时候仅能接收310左右,最多能接收700,想请教一下是怎么回事的,相关代码如下:
SendSocketMsg(char* pMsg, UINT iLen)
{
SOCKETPACKAGE package;
package.uTotalLength = iLen;
int iTotalPerr = iLen/MAX_SOCKETTRANSMISSION;
if (iLen%MAX_SOCKETTRANSMISSION)
{
iTotalPerr += 1;
}
package.sTotalPeer = iTotalPerr;
for (int i = 0; i < iTotalPerr; i++)
{
package.sCurrPeer = i;
char* pStartPos = pMsg+i*MAX_SOCKETTRANSMISSION;
memset(package.data,0,strlen(package.data));
int minLen = min(iLen-i*MAX_SOCKETTRANSMISSION,MAX_SOCKETTRANSMISSION);
memcpy(package.data, pStartPos,minLen);
Send(&package,sizeof(package));
}
}

OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
//::SendMessage(m_ParentHwnd,UM_SOCKETMSG_RECEIVE,(WPARAM)this,NULL);

SOCKETPACKAGE package;
Receive(&package,sizeof(SOCKETPACKAGE));
if(package.sCurrPeer == 0)
{
if (m_DataBuf)
{
delete m_DataBuf;
m_DataBuf = NULL;
}
m_DataBuf = new char[package.uTotalLength];
memset(m_DataBuf,0,package.uTotalLength);
}
if (m_DataBuf!=NULL)
{
//int iLen = package.uTotalLength - package.sCurrPeer*MAX_SOCKETTRANSMISSION;
// WRITE_LOG("%d次收到大小%d",package.sCurrPeer,iLen);
//strcpy(m_DataBuf+package.sCurrPeer*MAX_SOCKETTRANSMISSION, package.data);
int minLen = min(package.uTotalLength-package.sCurrPeer*MAX_SOCKETTRANSMISSION,MAX_SOCKETTRANSMISSION);
memcpy(m_DataBuf+package.sCurrPeer*MAX_SOCKETTRANSMISSION, package.data, minLen);
// WRITE_LOG("接收到第%d包,总共%d个包,总共大小为%d,内容为%s",package.sCurrPeer,package.sTotalPeer,package.uTotalLength,package.data);
}
if (package.sCurrPeer+1 == package.sTotalPeer)
{
::SendMessage(m_ParentHwnd,UM_SOCKETMSG_RECEIVE,(WPARAM)this,(LPARAM)m_DataBuf);
}
CAsyncSocket::OnReceive(nErrorCode);
}

作者: relech25   发布时间: 2011-12-06

用抓包工具查看一下通信过程

作者: oyljerry   发布时间: 2011-12-06

粘包了,只看收到的长度是否一致即可。

作者: wwwllg   发布时间: 2011-12-09