📄 transfersocket.cpp
字号:
TCHAR buffer[1000];
memset(buffer,0,1000);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErrorCode, 0, buffer, 999, 0);
CString str;
str.Format(IDS_ERRORMSG_CANTOPENTRANSFERCHANNEL,buffer);
str.Replace( _T("\n"), _T("\0") );
str.Replace( _T("\r"), _T("\0") );
m_pOwner->ShowStatus(str,1);
Close();
if (!m_bSentClose)
{
m_nMode|=CSMODE_TRANSFERERROR;
m_bSentClose=TRUE;
m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
}
}
else
{
/* Set internal socket send buffer to twice the programs buffer size
* this should fix the speed problems some users have reported
*/
DWORD value;
int len = sizeof(value);
GetSockOpt(SO_SNDBUF, &value, &len);
if (value < (BUFSIZE*2))
{
value = BUFSIZE * 2;
SetSockOpt(SO_SNDBUF, &value, sizeof(value));
}
}
if (m_nTransferState == STATE_STARTING)
{
m_nTransferState = STATE_STARTED;
m_TransferedFirst = m_StartTime = CTime::GetCurrentTime();
m_LastActiveTime=CTime::GetCurrentTime();
if (m_pSslLayer)
{
AddLayer(m_pSslLayer);
m_pSslLayer->InitClientSSL();
}
if (m_pGssLayer)
{
AddLayer(m_pGssLayer);
}
}
}
void CTransferSocket::OnClose(int nErrorCode)
{
LogMessage(__FILE__, __LINE__, this, FZ_LOG_DEBUG, _T("OnClose(%d)"), nErrorCode);
if (m_nTransferState == STATE_WAITING)
{
m_nNotifyWaiting |= FD_CLOSE;
return;
}
OnReceive(0);
Close();
if (!m_bSentClose)
{
m_bSentClose=TRUE;
m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
}
}
int CTransferSocket::CheckForTimeout(int delay)
{
UpdateStatusBar(false);
if (!m_bCheckTimeout)
return 1;
CTimeSpan span = CTime::GetCurrentTime()-m_LastActiveTime;
if (span.GetTotalSeconds()>=delay)
{
m_pOwner->ShowStatus(IDS_ERRORMSG_TIMEOUT, 1);
Close();
if (!m_bSentClose)
{
m_nMode |= CSMODE_TRANSFERTIMEOUT;
m_bSentClose = TRUE;
VERIFY(m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode));
}
return 2;
}
return 1;
}
void CTransferSocket::SetActive()
{
LogMessage(__FILE__, __LINE__, this, FZ_LOG_DEBUG, _T("SetActive()"));
if (m_nTransferState == STATE_WAITING)
m_nTransferState = STATE_STARTING;
m_bCheckTimeout = TRUE;
m_LastActiveTime = CTime::GetCurrentTime();
if (m_nNotifyWaiting & FD_READ)
OnReceive(0);
if (m_nNotifyWaiting & FD_WRITE)
OnSend(0);
if (m_nNotifyWaiting & FD_CLOSE)
OnClose(0);
}
void CTransferSocket::OnSend(int nErrorCode)
{
if (m_nTransferState == STATE_WAITING)
{
m_nNotifyWaiting |= FD_WRITE;
return;
}
if (m_bSentClose)
return;
if (m_bListening)
return;
if (m_nMode&CSMODE_UPLOAD && !(m_nMode&CSMODE_LIST))
{
if (!m_pFile)
return;
if (m_nTransferState == STATE_STARTING)
OnConnect(0);
if (m_pSslLayer && m_bShutDown)
return;
if (!m_pBuffer)
m_pBuffer = new char[BUFSIZE];
int numread;
TRY
{
bool beenWaiting = false;
_int64 currentBufferSize;
if (GetState() != closed)
currentBufferSize = m_pOwner->GetAbleToUploadSize(beenWaiting);
else
currentBufferSize = BUFSIZE;
if (m_bufferpos<currentBufferSize)
{
if (!m_transferdata.bType)
numread=m_pFile->Read(m_pBuffer+m_bufferpos, static_cast<int>(currentBufferSize-m_bufferpos));
else
{ //Read the file as ASCII file with CRLF line end
if (!m_ReadBuffer)
m_ReadBuffer=new char[BUFSIZE];
if (!m_ReadSize)
m_ReadSize = m_pFile->Read(m_ReadBuffer, static_cast<int>(currentBufferSize));
numread = 0;
while (numread<(currentBufferSize-m_bufferpos))
{
if (m_ReadPos>=m_ReadSize)
{
if (m_ReadPos!=currentBufferSize)
break;
else
{
m_ReadSize = m_pFile->Read(m_ReadBuffer, static_cast<int>(currentBufferSize));
m_ReadPos=0;
continue;
}
}
if (m_ReadBuffer[m_ReadPos]=='\n' && m_cLastChar!='\r')
{
m_pBuffer[m_bufferpos+numread++]='\r';
}
if (numread!=currentBufferSize)
{
m_pBuffer[m_bufferpos+numread]=m_ReadBuffer[m_ReadPos];
m_cLastChar=m_pBuffer[m_bufferpos+numread];
numread++;
m_ReadPos++;
}
else
m_cLastChar='\r';
}
}
}
else
numread=0;
ASSERT((numread+m_bufferpos)<=BUFSIZE);
ASSERT(numread>=0);
ASSERT(m_bufferpos>=0);
if (numread+m_bufferpos <= 0)
{
if (ShutDown() || GetLastError()!=WSAEWOULDBLOCK)
{
Close();
if (!m_bSentClose)
{
m_bSentClose=TRUE;
m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
}
}
return;
}
int numsent = Send(m_pBuffer, numread+m_bufferpos);
if (numsent!=SOCKET_ERROR)
{
Transfered( numsent, CTime::GetCurrentTime());
m_pOwner->SpeedLimitAddUploadedBytes(numsent);
}
int nLoopCount = 0;
while (TRUE)
{
if (numsent != SOCKET_ERROR)
{
m_LastActiveTime = CTime::GetCurrentTime();
UpdateSendLed();
m_transferdata.transferleft -= numsent;
}
/* if (numsent!=SOCKET_ERROR && numsent!=(numread+m_bufferpos))
{
int pos=numread+m_bufferpos-numsent;
char *tmp=new char[pos];
memcpy(tmp,m_pBuffer+numsent,pos);
memcpy(m_pBuffer,tmp,pos);
m_bufferpos=pos;
delete [] tmp;
if (!m_pOwner->SpeedLimitGetUploadBytesAvailable())
beenWaiting = true;
else
/* Give control back to the system. Else FileZilla would
* consume most CPU power until the data was sent.
* This behaviour is very strange, and I can't explain it,
* maybe it's just another bug in Windows
*/
/*Sleep(0);
if ((nLoopCount%100) || beenWaiting)
UpdateStatusBar(false);
return;
}*/
if (numsent==SOCKET_ERROR || !numsent)
{
/* Give control back to the system. Else FileZilla would
* consume most CPU power until the data was sent.
* This behaviour is very strange, and I can't explain it,
* maybe it's just another bug in Windows
*/
Sleep(0);
int nError = GetLastError();
if (nError==WSAENOTCONN)
{
//Not yet connected
m_bufferpos += numread;
return;
}
if (nError==WSAEWOULDBLOCK)
m_bufferpos += numread;
else
{
if (ShutDown() || GetLastError()!=WSAEWOULDBLOCK)
{
Close();
if (!m_bSentClose)
{
m_nMode |= CSMODE_TRANSFERERROR;
m_bSentClose = TRUE;
m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
}
}
}
UpdateStatusBar(false);
return;
}
else
{
int pos = numread + m_bufferpos - numsent;
if (!pos && numread<(currentBufferSize-m_bufferpos) && m_bufferpos!=currentBufferSize)
{
if (ShutDown() || GetLastError()!=WSAEWOULDBLOCK)
{
Close();
if (!m_bSentClose)
{
m_bSentClose=TRUE;
m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
}
}
return;
}
if (!pos)
m_bufferpos = 0;
else
{
memmove(m_pBuffer, m_pBuffer+numsent, pos);
m_bufferpos=pos;
}
}
//Check if there are other commands in the command queue.
MSG msg;
if (PeekMessage(&msg, 0, m_nInternalMessageID, m_nInternalMessageID, PM_NOREMOVE))
{
//Send resume message
LogMessage(__FILE__, __LINE__, this, FZ_LOG_DEBUG, _T("Message waiting in queue, resuming later"));
TriggerEvent(FD_WRITE);
UpdateStatusBar(false);
return;
}
nLoopCount++;
UpdateStatusBar(false);
if (GetState() != closed)
currentBufferSize = m_pOwner->GetAbleToUploadSize( beenWaiting);
else
currentBufferSize = BUFSIZE;
if (m_bufferpos<currentBufferSize)
{
if (!m_transferdata.bType)
{
numread=m_pFile->Read(m_pBuffer+m_bufferpos, static_cast<int>(currentBufferSize-m_bufferpos));
ASSERT((numread+m_bufferpos)<=currentBufferSize);
}
else
{ //Read the file as ASCII file with CRLF line end
if (!m_ReadBuffer)
m_ReadBuffer=new char[BUFSIZE];
if (!m_ReadSize)
m_ReadSize=m_pFile->Read(m_ReadBuffer, static_cast<int>(currentBufferSize));
numread=0;
while (numread<(currentBufferSize-m_bufferpos))
{
if (m_ReadPos>=m_ReadSize)
{
if (m_ReadPos!=currentBufferSize)
break;
else
{
m_ReadSize = m_pFile->Read(m_ReadBuffer, static_cast<int>(currentBufferSize));
m_ReadPos=0;
continue;
}
}
if (m_ReadBuffer[m_ReadPos]=='\n' && m_cLastChar!='\r')
{
m_pBuffer[m_bufferpos+numread++]='\r';
}
if (numread!=currentBufferSize)
{
m_pBuffer[m_bufferpos+numread]=m_ReadBuffer[m_ReadPos];
m_cLastChar=m_pBuffer[m_bufferpos+numread];
numread++;
m_ReadPos++;
}
else
m_cLastChar='\r';
}
}
}
else
numread = 0;
ASSERT(numread>=0);
ASSERT(m_bufferpos>=0);
numsent = Send(m_pBuffer, numread+m_bufferpos);
if (numsent!=SOCKET_ERROR)
{
Transfered(numsent, CTime::GetCurrentTime());
m_pOwner->SpeedLimitAddUploadedBytes(numsent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -