From 577427e68ef10a4d2b75d28e42b22952ae3bcf23 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sun, 02 Jul 2006 22:16:25 +0000 Subject: Do not close RRQ socket until the last ACK is received. git-svn-id: http://svn.klever.net/kin/pumpkin/trunk@152 fe716a7a-6dde-0310-88d9-d003556173a8 --- (limited to 'PumpKINDlg.cpp') diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp index 070f3e8..2a01918 100644 --- a/PumpKINDlg.cpp +++ b/PumpKINDlg.cpp @@ -579,10 +579,10 @@ int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); return TRUE; } -void CXferSocket::DoSelect() +void CXferSocket::DoSelect(BOOL do_select) { if(m_Peer.sin_addr.s_addr!=INADDR_NONE) - AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE)); + AsyncSelect(FD_CLOSE|FD_READ|((m_Queue.IsEmpty()&&!do_select)?0:FD_WRITE)); } void CXferSocket::OnReceive(int nErrorCode) @@ -854,11 +854,7 @@ tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize)); m_LastSlack = m_blkSize-bytes; PostTFTP(p); if(bytesLogLine(tmp); + state=stateClosing; m_ACKtoClose = m_ACK+1; } }CATCH(CFileException,e){ Deny(e); @@ -936,39 +932,47 @@ BOOL CRRQSocket::OnTFTP(tftp* p) BOOL rv = TRUE; switch(p->Opcode()){ case tftp::opOACK: - m_ACK=0; - ASSERT(state!=stateFinish); - { - tftp::tftpOptions o; - if(p->GetOptions(&o)){ - CString v; - if(o.Lookup(tftpoBSize,v)){ - m_blkSize=atoi(v); - if(!m_blkSize){ // *** More sanity checks - Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); - rv = TRUE; - break; + { + m_ACK=0; + ASSERT(state!=stateFinish); + tftp::tftpOptions o; + if(p->GetOptions(&o)){ + CString v; + if(o.Lookup(tftpoBSize,v)){ + m_blkSize=atoi(v); + if(!m_blkSize){ // *** More sanity checks + Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); + rv = TRUE; + break; + } } - } - if(o.Lookup(tftpoTOut,v)){ - m_timeOut=atoi(v); - if(!m_timeOut){ // *** More sanity checks - Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); - rv = TRUE; - break; + if(o.Lookup(tftpoTOut,v)){ + m_timeOut=atoi(v); + if(!m_timeOut){ // *** More sanity checks + Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); + rv = TRUE; + break; + } + } + if(o.Lookup(tftpoXResume,v)){ + m_ACK=atoi(v); } } - if(o.Lookup(tftpoXResume,v)){ - m_ACK=atoi(v); - } + UpdateList(); + DoXfer(); } - UpdateList(); - DoXfer(); - } break; case tftp::opACK: m_ACK=p->data.m_ACK.Block(); - if(state!=stateFinish){ + if(state==stateClosing && m_ACK==m_ACKtoClose) { + state = stateFinish; + ASSERT(m_Daddy); + CString tmp; + tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName); + m_Daddy->LogLine(tmp); + rv = FALSE; + DoSelect(TRUE); + }else if(state!=stateFinish){ UpdateList(); DoXfer(); } -- cgit v0.9.0.2