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

📄 transfersocket.cpp

📁 一个FTP下载的源代码。代码质量非常高
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -