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

📄 view_old.cpp

📁 简单的ftp客户端下载程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
										fprintf( m_pXferFilePointer, "%s", str );
									}
								}
								str=strtok((char *)NULL,"\n");
							}
						}
					} while( nRet != SOCKET_ERROR && nRet > 0 ); 
					fclose(m_pXferFilePointer);
					m_pXferFilePointer = NULL;
					m_bSavingFile = FALSE;
					m_bFileHasBeenSaved = TRUE;
					EndWaitCursor(); // kill hourglass 
				} // end of else if on !bCancel && m_nRadioASCII 
			}
			break;

		case FD_ACCEPT:
			AfxMessageBox("data accept");
			/*ASSERT(m_pWinsockListen != NULL);
			sTemp = m_pWinsockListen->Accept(NULL,NULL);*/
			//sTemp = m_pWinsockListen->GetWSocket();
			/*ASSERT(sTemp != INVALID_SOCKET);
			m_pWinsockData->SetSocket(sTemp);
			m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_LINGER,0,0);	
			m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_REUSEADDR,0,0);
			m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_KEEPALIVE,0,0);
			m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_OOBINLINE,0,0);*/
			//m_pWinsockListen->CloseSocket();
			// its a window so destroy it first
			//m_pWinsockListen->DestroyWindow();
			//delete m_pWinsockListen;
			//m_pWinsockListen = NULL; 

			//sOut.Format("\r\nMiniFTP Status>Data Connection made OK (socket %d)\r\n\r\n", sTemp);
			//sOut.Format("\r\nMiniFTP Status>Data Connection made OK\r\n\r\n");
			//Log(sOut);
			break;

		case FD_WRITE:
			if( m_bStoringFile) 
			{
				if( m_bWaitingForTimeout ) // may be a big file
				{
					KillTimer(ID_MYTIMEOUT);
					m_bWaitingForTimeout = FALSE;
				}

				ASSERT( m_pXferFilePointer==NULL );
				m_pXferFilePointer = fopen( (const char *)m_sStoringFilePath, "rb" );
				if( !m_pXferFilePointer )
				{
					sOut.Format( "Specifed file\n%s\ncannot be found", m_sStoringFilePath );
					if( AfxMessageBox( sOut ) == IDOK )
					{
						m_bStoringFile = FALSE;
						return 0L;
					}
				}
				do
				{
					nr = fread( (char *)m_szDataInBuffer, sizeof( char ), 1024, m_pXferFilePointer ); 
					if( nr > 0 )
					{
						send( m_sktData, m_szDataInBuffer, nr, 0);
					}
				} while( nr > 0 );
				m_bStoringFile = FALSE;
				m_bFileHasBeenStored = TRUE;
				fclose( m_pXferFilePointer );
				m_pXferFilePointer==NULL;
			} // end of if on m_bStoringFile
			break;
	}
	return 0L;
}



/////////////////////////////////////////////////////////////////////////////
void CMiniFTPView::OnConnect() 
{
	CConnectDlg dlg;
	dlg.m_sHost = AfxGetApp()->GetProfileString("Connect", "Host", "");
	dlg.m_sName = AfxGetApp()->GetProfileString("Connect", "Name", "");
	dlg.m_sPassword = AfxGetApp()->GetProfileString("Connect", "Password", "");
	 
	// instantiate the winsock class if not active already.
	// we do this here instead of the view's constructor
	// because when the view's constructor is called, it's m_hwnd is NULL

	// run dialog
	if( dlg.DoModal() == IDOK)	  
	{
		// housecleaning?
		if( dlg.m_bClearWindow )
		{
			GetEditCtrl().SetWindowText("");
		}

		// make the winsock object
		//MakeSockObj();
		//ASSERT( m_pWinsockControl != NULL);

		// make the connection
		BeginWaitCursor(); // show hourglass 

		//SOCKET sTemp;
		m_sktControl = ConnectToServer(
							(const char *)dlg.m_sHost,
							"21" );
		EndWaitCursor(); // kill hourglass 

		if( SOCKET_ERROR != m_sktControl && INVALID_SOCKET != m_sktControl )
		{
			WSAAsyncSelect ( m_sktControl, AfxGetMainWnd()->m_hWnd, 
					WM_WINSOCK_EVENT_FRAME_CONTROL, 
					FD_WRITE|FD_READ|FD_CLOSE|FD_ACCEPT);

			int nChars=GetWindowTextLength();    // get the index of the last line
			if( nChars != 0 )
			{
				Log("\r\n"); // only do if not the first line in the CEdit
			}
			CString sOut;
			sOut.Format("MiniFTP Status>Control Connection made OK (socket %d)\r\n\r\n", 
							m_sktControl );
			Log(sOut);

			// save settings in ini file
			AfxGetApp()->WriteProfileString("Connect", "Host", dlg.m_sHost);
			AfxGetApp()->WriteProfileString("Connect", "Name", dlg.m_sName);
			AfxGetApp()->WriteProfileString("Connect", "Password", dlg.m_sPassword);

			// save so state machine can use
			m_sName = dlg.m_sName;
			m_sPassword = dlg.m_sPassword; 

			//  need to logon

			// form command list
			// send name
			sOut = "USER ";
			sOut += m_sName;
			m_sCommandList.AddTail(sOut);

			// send	password
			sOut = "PASS ";
			sOut += m_sPassword;
			m_sCommandList.AddTail(sOut);

			// kick off the state machine 
			// THIS IS WHERE THIS APP REALLY STARTS
			ASSERT( !m_bTimerOn );
			SetTimer(ID_MYTIMER, REPTIME, NULL);
			m_bTimerOn = TRUE;
		}
		else
		{
			CString sOut, sMoreout;
			sOut.Format("Connection error code %d", m_sktControl);
			sMoreout = "";
			switch (m_sktControl) 	  // which error?
			{
				case SOCKET_ERROR:
					sMoreout = " (SOCKET_ERROR or INVALID_SOCKET)";
					break;
		/*		case INVALID_SOCKET:
					sMoreout = " (INVALID_SOCKET)";
					break;  */
			} // end of switch
			sOut += sMoreout;
			AfxMessageBox(sOut);

			// kill the winsock object
			//KillSockObj();
		}
	} // end of if on domodal
	// defeat the final "save document" dialog on app exit
	GetDocument()->SetModifiedFlag(FALSE); 
}

/////////////////////////////////////////////////////////////////////////////
// use this function to connect to a host on a port
void CMiniFTPView::UserCommand(CString sCommand)
{
	if( sCommand.GetLength() == 0 )
	{
		return;
	}
	//m_bSavingFile = FALSE; // if it ever was true, is isnt now!
	//m_bInTransit = TRUE;
	//SOCKET sTemp;
	//ASSERT( m_pWinsockListen != NULL);

	if( m_sktListen != INVALID_SOCKET )
	{
		closesocket(m_sktListen);
	}
	m_sktListen = INVALID_SOCKET;

   	CString sOut;
	m_sktListen = ConnectToListen( "0", "0");
	if( m_sktListen == INVALID_SOCKET )
	{
		Log("\r\nMiniFTP Status>Could not form Listen socket");
		::MessageBeep(MB_OK);
		return;
	}
	else
	{
		WSAAsyncSelect ( m_sktListen, AfxGetMainWnd()->m_hWnd, 
					WM_WINSOCK_EVENT_FRAME_LISTEN, 
					FD_WRITE|FD_READ|FD_CLOSE|FD_ACCEPT);

		sOut.Format("\r\nMiniFTP Status>Listen Connection made OK (socket %d)\r\n\r\n", 
						m_sktListen );
		Log(sOut);

		listen( m_sktListen, 3 );

		// inform remote end about our port that we created.
		// get the port name that we got for later transmission in PORT cmd
		struct sockaddr_in saCtrlAddr;
		int iLength=sizeof(saCtrlAddr);
		getsockname(m_sktListen,(struct sockaddr *)&saCtrlAddr,&iLength);

		struct sockaddr_in saTmpAddr;
		iLength = sizeof (saTmpAddr);
		if (getsockname(m_sktControl,(LPSOCKADDR)&saTmpAddr, &iLength)
						==SOCKET_ERROR)
		{
			AfxMessageBox("getsockname problem");
		}

		char *a,*p;
		a = (char *)&saTmpAddr.sin_addr;
		p = (char *)&saCtrlAddr.sin_port;
		#define  UC(b)  (((int)b)&0xff)
		CString sPort= "PORT ";
		sPort.Format( "PORT %d,%d,%d,%d,%d,%d",
				UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
				UC(p[0]), UC(p[1]) );
			
		/*m_pWinsockControl->Send((const char *)sPort, sPort.GetLength(), 0);
		Log(sPort);
		sPort = "\r\n";
		m_pWinsockControl->Send((const char *)sPort, sPort.GetLength(), 0);
		Log(sPort);	*/
		m_sCommandList.AddTail(sPort);

		// what else to add to list
		CString sTemp = sCommand;
		sTemp = sTemp.Left(4);
		sTemp.MakeUpper();
		if( sTemp == "RETR" || sTemp == "STOR" )
		{
			if(sTemp == "RETR")
			{
				m_bSavingFile = TRUE;
				m_bFileHasBeenSaved = FALSE;
			}
			if(sTemp == "STOR")
			{
				m_bStoringFile = TRUE;
				m_bFileHasBeenStored = FALSE;
				sTemp = sCommand;
				sTemp = sTemp.Right( sTemp.GetLength() - 5);
				sTemp.TrimRight();
				sTemp.TrimLeft();
				m_sStoringFilePath = sTemp; // save it so the event handler can reference
			}
			m_bSavingFile = TRUE;
			m_bFileHasBeenSaved = FALSE;
			sTemp = "TYPE ";
			if( m_nRadioASCII )
			{
				sTemp += "A";
			}
			else
			{
				sTemp += "I";
			}
			m_sCommandList.AddTail(sTemp);
		}

		m_sCommandList.AddTail(sCommand);


		// kick off the state machine 
		// THIS IS WHERE THIS APP REALLY STARTS
		ASSERT( !m_bTimerOn );
		SetTimer(ID_MYTIMER, REPTIME, NULL);
		m_bTimerOn = TRUE;


		/*m_sktData = accept(m_sktListen, NULL, NULL);

		memset(m_szDataInBuffer,0,NUM1024+2);
		// this memset trick avoids having strtok insert a wild \0 somewhere bad
		//		it is guaranteed to find a \n (the delimiter in this case) before
		//		running off into other memory
		memset(m_szDataInBuffer+NUM1024, '\n', 1); 
		recv( m_sktData, m_szDataInBuffer, NUM1024, 0 );
		DisplaySktRead(m_szDataInBuffer);*/


		//m_nState = 3;
		//m_bInTransit= FALSE;
		//m_bReplyReceived = FALSE;
	} // end of else on m_sktListen
}

/////////////////////////////////////////////////////////////////////////////
// use this function to connect to a host on a port
int CMiniFTPView::DoCommand(CString s)
{
	int nRet;
	if( m_sktControl != INVALID_SOCKET )
	{
		send( m_sktControl, (const char *)s, s.GetLength(), 0);
		CString sTemp;
		sTemp = s;
		sTemp.MakeUpper();
		sTemp = sTemp.Left(4);
		if( sTemp == "PASS" )
		{
			Log( "PASS (hidden)");
		}
		else
		{
			Log(s);
		}
		CString sCRLF = "\r\n";
		send( m_sktControl, (const char *)sCRLF, sCRLF.GetLength(), 0);
		Log(sCRLF);

		CString sRet;
		nRet = 200;
	}
	else
	{
		nRet = 600;
	}
	return( nRet / 100 );
}

/////////////////////////////////////////////////////////////
// use this function to connect to a host on a port
SOCKET CMiniFTPView::ConnectToListen(const char *name, const char *port)
{
	SOCKET s = INVALID_SOCKET;

	struct sockaddr_in far server;
	struct hostent far *hp;
	char msg[100];

	int portnum = atoi(port);

	while( *name != 0 && *name == ' ' )
	{
		name++;
	}

	if( (name[0] >= '0') && (name[0] <= '9') ) 
	{
		memset((char *) &server,0,sizeof(server));
		server.sin_family      = AF_INET;
		server.sin_addr.s_addr = inet_addr(name);
		server.sin_port        = htons(portnum);
	}
	else
	{ 
		if ( (hp = (hostent far *) gethostbyname(name)) == NULL)
		{
			sprintf(msg,"Error: Connecting to %s.", name);
			if(AfxMessageBox( msg ) == IDOK)
			{
				return INVALID_SOCKET;
			}
		}
		memset((char *) &server,0,sizeof(server));
		memcpy((char *) &server.sin_addr,hp->h_addr,hp->h_length);
		server.sin_family = hp->h_addrtype;
		server.sin_port = htons(portnum);  
	}// else 

	// create socket 
	if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 1) 
	{
		sprintf(msg,"Error opening stream socket");
		if(AfxMessageBox( msg ) == IDOK)
		{
			return INVALID_SOCKET;
		}
	}
  
	if (bind(s, (struct sockaddr far *)&server, sizeof(server))< 0)
	{
		sprintf(msg,"Cannot bind to %s on port %s",name,port);
		if(AfxMessageBox( msg ) == IDOK)
		{
			return INVALID_SOCKET;
		}
	}

	setsockopt( s, SOL_SOCKET,SO_LINGER,0,0);	
	setsockopt( s, SOL_SOCKET,SO_REUSEADDR,0,0);
	setsockopt( s, SOL_SOCKET,SO_KEEPALIVE,0,0);

	return s;		   
}

/////////////////////////////////////////////////////////////////////////////
// use this function to connect to a host on a port
SOCKET CMiniFTPView::ConnectToServer(const char *name, const char *port)
{
	SOCKET s = INVALID_SOCKET;

	struct sockaddr_in far server;
	struct hostent far *hp;
	char msg[100];

	int portnum = atoi(port);

	while( *name != 0 && *name == ' ' )
	{
		name++;
	}

	if( *name == 0 || portnum == 0)
	{
		return INVALID_SOCKET;
	}

	if( (name[0] >= '0') && (name[0] <= '9') ) 
	{
		memset((char *) &server,0,sizeof(server));
		server.sin_family      = AF_INET;
		server.sin_addr.s_addr = inet_addr(name);
		server.sin_port        = htons(portnum);
	}
	else
	{ 
		if ( (hp = (hostent far *) gethostbyname(name)) == NULL)
		{
			sprintf(msg,"Error: Connecting to %s.", name);

			if(AfxMessageBox( msg ) == IDOK)
			{
				return INVALID_SOCKET;
			}
		}
		memset( (char *) &server, 0, sizeof(server));
		memcpy( (char *) &server.sin_addr, hp->h_addr, hp->h_length );
		server.sin_family = hp->h_addrtype;
		server.sin_port = htons( portnum );  
	}// end of else 

	// create socket 
	if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 1) 
	{
		sprintf( msg,"Error opening stream socket" );
		if(AfxMessageBox( msg ) == IDOK)
		{
			return INVALID_SOCKET;
		}
	}
  
	if (connect( s, (struct sockaddr far *)&server, sizeof(server))< 0 )
	{
		sprintf( msg,"Cannot connect to %s on port %s",name,port);
		if(AfxMessageBox( msg ) == IDOK)
		{
			return INVALID_SOCKET;
		}
	}

	setsockopt( s, SOL_SOCKET, SO_LINGER, 0, 0 );	
	setsockopt( s, SOL_SOCKET, SO_REUSEADDR, 0, 0 );
	setsockopt( s, SOL_SOCKET, SO_KEEPALIVE, 0, 0 );

	return s;		   
}

/////////////////////////////////////////////////////////////////////////////
void CMiniFTPView::OnFsettings() 
{
	CXport dlg;
	dlg.m_nRadioASCII = AfxGetApp()->GetProfileInt("Setting", "ASCII", 0);
	dlg.m_sExportFileName = AfxGetApp()->GetProfileString("Setting", "Name", "");

	if( dlg.DoModal() == IDOK)	  
	{
		// save settings in ini file
		AfxGetApp()->WriteProfileInt("Setting", "ASCII", dlg.m_nRadioASCII );
		AfxGetApp()->WriteProfileString("Setting", "Name", dlg.m_sExportFileName);
		m_nRadioASCII = dlg.m_nRadioASCII;
		m_sExportFileName = dlg.m_sExportFileName;
	}
}

/////////////////////////////////////////////////////////////////////////////
void CMiniFTPView::OnCloseconn() 
{
	if( m_sktControl != INVALID_SOCKET )
	{
		closesocket(m_sktControl);
		m_sktControl = INVALID_SOCKET;
	}	
	if( m_sktListen != INVALID_SOCKET )
	{
		closesocket(m_sktListen);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -