📄 view_old.cpp
字号:
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 + -