接收端接收到了所有的包,但前面几个数据是对的,后面的不对,这是为什么?(通过TCP传输大数据时)
通过TCP传输大数据时:接收端接收到了所有的包,但前面几个数据是对的,后面的不对,都为零,这是为什么?
(发送端显示数据是一次就发完了(数据大小:360054字节);即FileLength=360054;
接收端分了很多次接收,但都接收到了.)
我是采用异步I/O的方式:
(1)发送端:
....
int nLeft;
nLeft = FileLength;//将要发送的BMP数据的长度.
int idx;
idx = 0;
while (nLeft > 0)
{
//SendFileInf[SendFileIndex].pFileMemoryAddr为将要发送的数据缓冲区地址
ret = send(SendDataSock, SendFileInf[SendFileIndex].pFileMemoryAddr + idx, nLeft, 0);
if (ret == SOCKET_ERROR)
{
AfxMessageBox("Send() BMP Data Error!");
break;
}
nLeft -= ret;
idx += ret;
TRACE("ret is %d\n", ret);
TRACE("idx is %d\n", idx);
}
....
(2)接收端:
case FD_READ:
//m_SendProc[nIndex][0].SendID为接收端套接字,pbuff为缓冲区
ret = recv(m_SendProc[nIndex][0].SendID, pbuff, 1024, 0);//接收数据
// m_SendProc[nIndex][FileNo].pFileMemoryAddr为接收数据缓冲区.
//m_SendProc[nIndex][FileNo].CurRecvFileLen为每次接收到的数据的累积长度.
memcpy(m_SendProc[nIndex][FileNo].pFileMemoryAddr + m_SendProc[nIndex][FileNo].CurRecvFileLen, pbuff, ret);
m_SendProc[nIndex][FileNo].CurRecvFileLen += ret;
//调试时显示接收到的包的长度.
TRACE("m_SendProc[nIndex][FileNo].CurRecvFileLen is %d", m_SendProc[nIndex][FileNo].CurRecvFileLen);
//清空缓冲区
ZeroMemory(pbuff, 1024);
break;
问题点数:100、回复次数:2Top
1 楼xingchen_ak(星辰)回复于 2002-11-21 15:17:45 得分 100
tcp协议的send()只是将数据放入缓冲区,立刻返回
如果一次发送数据量太大,会缓冲区溢出Top
2 楼zoutaiqi(David)回复于 2002-11-26 12:26:00 得分 0
我知道了,是我的程序中的问题Top




