关于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);
}
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28