📄 subject_21961.htm
字号:
<p>
序号:21961 发表者:水乡船哥 发表日期:2002-11-21 14:35:16
<br>主题:接收端接收到了所有的包,但前面几个数据是对的,后面的不对,这是为什么?(通过TCP传输大数据时)
<br>内容:通过TCP传输大数据时:接收端接收到了所有的包,但前面几个数据是对的,后面的不对,都为零,这是为什么?<BR><BR>(发送端显示数据是一次就发完了(数据大小:360054字节);即FileLength=360054;<BR>接收端分了很多次接收,但都接收到了.)<BR><BR><BR>我是采用异步I/O的方式:<BR>(1)发送端:<BR> ....<BR> int nLeft;<BR> nLeft = FileLength;//将要发送的BMP数据的长度.<BR> int idx;<BR> idx = 0;<BR> while (nLeft > 0)<BR> {<BR> //SendFileInf[SendFileIndex].pFileMemoryAddr为将要发送的数据缓冲区地址<BR> ret = send(SendDataSock, SendFileInf[SendFileIndex].pFileMemoryAddr + idx, nLeft, 0);<BR> if (ret == SOCKET_ERROR)<BR> { <BR> AfxMessageBox("Send() BMP Data Error!");<BR> break;<BR> }<BR> nLeft -= ret;<BR> idx += ret;<BR> TRACE("ret is %d\n", ret);<BR> TRACE("idx is %d\n", idx);<BR>}<BR>....<BR>(2)接收端:<BR>case FD_READ:<BR> //m_SendProc[nIndex][0].SendID为接收端套接字,pbuff为缓冲区<BR> ret = recv(m_SendProc[nIndex][0].SendID, pbuff, 1024, 0);//接收数据<BR> <BR> // m_SendProc[nIndex][FileNo].pFileMemoryAddr为接收数据缓冲区.<BR> //m_SendProc[nIndex][FileNo].CurRecvFileLen为每次接收到的数据的累积长度.<BR> memcpy(m_SendProc[nIndex][FileNo].pFileMemoryAddr + m_SendProc[nIndex][FileNo].CurRecvFileLen, pbuff, ret);<BR> m_SendProc[nIndex][FileNo].CurRecvFileLen += ret;<BR> //调试时显示接收到的包的长度.<BR> TRACE("m_SendProc[nIndex][FileNo].CurRecvFileLen is %d", m_SendProc[nIndex][FileNo].CurRecvFileLen);<BR> //清空缓冲区<BR> ZeroMemory(pbuff, 1024);<BR> <BR> break;<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-21 14:53:32
<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>
回复者:111 回复日期:2002-11-23 10:01:18
<br>内容:把接收程序改一下,再试!(应该是1024太小的原因)<BR>(2)接收端:<BR>char tmpbuf[50000];<BR>case FD_READ:<BR> ret = recv(m_SendProc[nIndex][0].SendID, tmpbuf, 50000, 0);//接收数据
<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-24 15:20:46
<br>内容:这与接收端缓冲区大小没关系,如果一次没收完,Winsock会通知你再收,如果你乐意可以一次只收一个字节,这样。Winsock会触发N次FD_READ,关键是再FD_READ消息中判断是不是正确的套结字,看样子就知道你是用多线程多套结字
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:111 回复日期:2002-11-25 16:46:35
<br>内容:楼上的可写过类似的程序?<BR>你可以试一下,Client端send 10个字节的数据,必然会触发Server端的FD_READ,如果在FD_READ里我只接收5个字节,照你的意思——还会触发Server端的FD_READ???大错特错!!!<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>
<font color=red>答案被接受</font><br>回复者:太平冰水 回复日期:2002-11-25 19:20:16
<br>内容:回复楼上的,我做了几年类似的程序,从来都是这样用的,只要你是在windows上编程,使用Winsock协议,就一定是这样的,可以看相关文档(在MSFN中搜索Winsock关键字)。使用TCP/IP协议首先Client使用Connect建立连接,如果成功Server的Accept会分配一个套结字,Server端程序使用这个套结字与Client端传输数据,如果Client此时Send了10个字节,Server会建立一个缓冲区接收10个字节,这对用户程序是透明的,Winsock协议做这些工作,他会向用户程序发送FD_READ消息,用户程序只用使用recv读数据就行了,如果一次没有读完,WinSock会再次触发FD_READ让应用程序读,如果应用程序要求读的数据字节数多于缓冲区内已经接收的数据字节数则会堵塞,直到读出所要求的数目或超时。如果你确信Client是正确Send了10字节,Server只收到5字节而没有再次触发FD_READ,那一定是你的程序错了。另外ioctlsocket可以得到当前buff的数据大小,具体用法可查MSDN。
<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-25 19:21:25
<br>内容:另外ioctlsocket可以得到当前buff的数据大小,具体用法可查MSDN。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Ancky 回复日期:2002-12-12 18:15:54
<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>
回复者:Ryan Liu 回复日期:2002-12-26 13:39:29
<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 + -