老马啊...有个问题有点麻烦...不知道能解决不
我用WINSOCK 的一个封装类做了个文件传送器.速度非常快,可老有堆栈空间溢出的问题.用WINSOCK控件就没问题.不知道怎么搞嘀...这个类是CSockMaster.相信你也用过吧?这个问题的片段如下:Public Function SendChunk() 'This is where we send the file data Dim ChunkSize As Long Dim Chunk() As Byte Dim arrHash() As Byte 'If wsSend.State <> sckConnected Then Exit Function ChunkSize = FT_BUFFER_SIZE If FileNum = 0 Then 'No data has been sent yet, open the file FileNum = FreeFile Open CCTV For Binary As #FileNum End If 'determine chunk size If (LOF(FileNum) - Loc(FileNum)) < FT_BUFFER_SIZE Then _ ChunkSize = (LOF(FileNum) - Loc(FileNum)) 'set array size to fit chunk ReDim Chunk(0 To ChunkSize - 1) 'read the chunk Get #FileNum, , Chunk 'Send the data Sentbyt = Sentbyt + ChunkSize ByteSec = ByteSec + ChunkSize 'See if file is sent If Sentbyt = FileSize Then Complete = True Close #FileNum cmdCancelClose.Caption = "&Close" End If wsSend.SendData Chunk End Function Private Sub wsSend_SendComplete() 'DoEvents If FileNum > 0 Then If Not Complete Then SendChunk Else If chkClose.Value = Checked Then wsSend.CloseSck Unload Me End If End If End If End Sub 不道有什么能解决的办法否?附上源码....[此贴子已经被作者于2008-3-19 16:43:35编辑过] <p>我晕啊,怎么上传不了,格式也这么乱...</p><p></p><p></p><p> 我用WINSOCK 的一个封装类做了个文件传送器.速度非常快,可老有堆栈空间溢出的问题.用WINSOCK控件就没问题.不知道怎么搞嘀...这个类是CSockMaster.相信你也用过吧?这个问题的片段如下:Public Function SendChunk()<br/>'This is where we send the file data<br/>Dim ChunkSize As Long<br/>Dim Chunk() As Byte<br/>Dim arrHash() As Byte<br/>
<br/>'If wsSend.State <> sckConnected Then Exit Function<br/>
<br/>ChunkSize = FT_BUFFER_SIZE<br/>If FileNum = 0 Then 'No data has been sent yet, open the file<br/> FileNum = FreeFile<br/> Open CCTV For Binary As #FileNum<br/>End If<br/>
<br/>'determine chunk size<br/>If (LOF(FileNum) - Loc(FileNum)) < FT_BUFFER_SIZE Then _<br/> ChunkSize = (LOF(FileNum) - Loc(FileNum))<br/>'set array size to fit chunk<br/>ReDim Chunk(0 To ChunkSize - 1)<br/>'read the chunk<br/>Get #FileNum, , Chunk<br/>'Send the data<br/>Sentbyt = Sentbyt + ChunkSize<br/>ByteSec = ByteSec + ChunkSize<br/>'See if file is sent<br/>If Sentbyt = FileSize Then<br/> Complete = True<br/> Close #FileNum<br/> cmdCancelClose.Caption = "&Close"<br/>End If<br/> wsSend.SendData Chunk<br/>
<br/>
<br/>End Function</p><p>Private Sub wsSend_SendComplete()<br/>'DoEvents<br/>If FileNum > 0 Then<br/> If Not Complete Then<br/> SendChunk<br/> Else<br/> If chkClose.Value = Checked Then<br/> wsSend.CloseSck<br/> Unload Me<br/> End If<br/> End If<br/>End If<br/>End Sub</p><p>不道有什么能解决的办法否?附上源码.... </p> 传不上来,我发到你邮箱里了,有空时看看,谢谢啦 <p>代码已经收到.</p><p>在我这里一切正常,没有出现你所说的问题.</p><p>我注册OCX后,就直接运行了EXE,然后服务器开始监听.</p><p>客户端连接后,就拼了命地点按钮,随便怎么点都不出问题....</p><p>你的环境是否与我不同?</p><p>我是2003+SP1.</p> 恩...我用的是XP-SP2,OCX?你用的是封装好的啊?我用的是类模块,全部API嘀,我再试试看.也许是你没把两个代码结合起来..我做个结合版的发给你... <p>代码发给你了,我把它们分开了,做了两个.现在发现问题所在如下:</p><p>1.MSWINSOCK.OCX在执行到:</p><p>Private Sub wsSend_SendComplete()<br/>DoEvents <------------------------这里时,条件符合呼叫到<br/>If FileNum > 0 Then<br/>If Not Complete Then<br/>SendChunk <------------------------这里,然后执行完后会执行后边的语句, Else 然后就可以释放堆栈空间,而SOCKETMASTER<br/>If chkClose.Value = Checked Then 则会不停的循环过程,不执行后边的语句.<br/>wsSend.CloseSck 造成堆栈空间不释放而溢出.</p><p>这个问题该怎么样解决呢?</p> <p>DoEvents 会造成过程重入(很大程度上)</p><p>这样的话,过程就会不断地被重复执行,直到堆栈的空间溢出.</p><p>堆栈这东东我也不清楚如何理解,如果它是使用的内存中的一部分,那就有可能是因为我内存大(2G)而不出错...嘿嘿.</p><p>反正能不用DoEvents就不用,不是好东西.</p><p>你可以试下我的那个多线程代码,用那个思路去写写程序看看.</p><p>地址:</p>http://www.m5home.com/blog/article.asp?id=54 感谢老马的细心解答...解决...在CSOCKETMASTER里加入一个防错机制就可以啦.. KANKAN
页:
[1]