⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_21791.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:21791 发表者:水乡船哥 发表日期:2002-11-20 14:32:29
<br>主题:通过TCP传输大数据时,为什么最后一个包接收端收不到?
<br>内容:通过TCP传输大数据时,为什么最后一个包接收端收不到?发送端都发完了,但接收端接收不到最后一个包.<BR>我是采用异步I/O的方式:<BR>(1)发送端:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nLeft;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nLeft = FileLength;//将要发送的BMP数据的长度.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int idx;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (nLeft &gt; 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SendFileInf[SendFileIndex].pFileMemoryAddr为将要发送的数据缓冲区地址<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = send(SendDataSock, SendFileInf[SendFileIndex].pFileMemoryAddr&nbsp;&nbsp; + idx, nLeft, 0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ret == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox("Send() BMP Data Error!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nLeft -= ret;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idx += ret;<BR>}<BR>....<BR>(2)接收端:<BR>case FD_READ:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //m_SendProc[nIndex][0].SendID为接收端套接字,pbuff为缓冲区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = recv(m_SendProc[nIndex][0].SendID, pbuff, 1024, 0);//接收数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// m_SendProc[nIndex][FileNo].pFileMemoryAddr为接收数据缓冲区.<BR>&nbsp;&nbsp;&nbsp;&nbsp; //m_SendProc[nIndex][FileNo].CurRecvFileLen为每次接收到的数据的累积长度.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(m_SendProc[nIndex][FileNo].pFileMemoryAddr + m_SendProc[nIndex][FileNo].CurRecvFileLen, pbuff, ret);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_SendProc[nIndex][FileNo].CurRecvFileLen += ret;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调试时显示接收到的包的长度.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE("m_SendProc[nIndex][FileNo].CurRecvFileLen is %d", m_SendProc[nIndex][FileNo].CurRecvFileLen);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清空缓冲区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(pbuff, 1024);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR><BR>这样,在调试时,接收端显示收到的数据长度要比发送端少最后一个包.
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:徐景周 回复日期:2002-11-20 14:58:30
<br>内容:是不是缓冲区大小或个数计算有误
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水乡船哥 回复日期:2002-11-20 14:59:54
<br>内容:而且我在nLeft -= ret;idx += ret;后加:TRACE("ret is %d\n", ret);<BR>TRACE("idx is %d\n", idx);后调试发现:发送端显示数据是一次就发完了(数据大小:360054字节);即FileLength便= 360054<BR>接收端分了很多次接收,这是为什么?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水乡船哥 回复日期:2002-11-20 15:02:42
<br>内容:应该不会,我的缓冲区(接收或发送)都大于360054
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水乡船哥 回复日期:2002-11-20 15:13:53
<br>内容:徐景周:"是不是缓冲区大小或个数计算有误"这句怎讲?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水乡船哥 回复日期:2002-11-20 15:56:18
<br>内容:我传输的是位图,我换了几个不同大小的位图传输时,接收端总有最后1014字节收不到.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:徐景周 回复日期:2002-11-20 17:12:34
<br>内容:延时一下,分段发送、接收试试。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水乡船哥 回复日期:2002-11-20 18:30:02
<br>内容:唉,发送端分片了,延时了还是不行
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水乡船哥 回复日期:2002-11-21 14:23:00
<br>内容:谢谢徐景周,我用Ioctrlsock函数看了一下,有一个包没有接收到.现在已经全部收到.<BR>谢谢!<BR><BR>但是新的问题又出来了.数据已经全部接收到,但是只有前面几个数据是对的,后面的一些数据不对,这是怎么回事呢?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -