编写一个登录Ftp服务器,取回所需文件的程序遇到的问题。
我现connect服务器21端口,连接成功,返回连接成功信息。
可是随后系统并不发给我提示输入User的包。发送如Open这样的包过去,都提示command not understand。因此我用telnet客户端连接到Ftp服务器上去,同样连接成功,Help显示命令列表,其中有USER、PASS等,可我用USER命令,同样提示command not understand消息。难道是我对Ftp协议了解不够所至,建立一个Ftp客户端还需要做什么工作?下面是我的代码
#include "stdafx.h"
#include "teltest.h"
#include "winsock2.h"
#include "stdio.h"
#define EOL "\r\n"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const int VERSION_MAJOR=1;
const int VERSION_MINOR=1;
const u_short iProtocolPort=21;
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
void GetTelnetEcho(SOCKET &s,const char *szBuf)
{
char l_szBuf[4096];
send(s,szBuf,strlen(szBuf),0);
memset(l_szBuf,0,sizeof(l_szBuf));
recv(s,l_szBuf,sizeof(l_szBuf),0);
printf("%s\n",l_szBuf);
}
int TelnetTest(int argc, char* argv[])
{
WSADATA WSData;
char szTelnetServerName[100];
char szBuffer[1000];
char szMsgLine[255];
SOCKADDR_IN SockAddr;
SOCKET hServer;
char szIpAddress[20];
if(argc<2)
{
printf("too few arguments\n");
exit(1);
}
strcpy(szIpAddress,argv[1]);
if ( WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData) )
{
MessageBox(0,"Cannot find Winsock","Error",MB_OK);
return(1);
}
//建立Telnet服务器sockaddr
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(iProtocolPort);
SockAddr.sin_addr.S_un.S_addr=inet_addr(szIpAddress);
hServer=socket(PF_INET,SOCK_STREAM,0);
if(hServer==INVALID_SOCKET)
{
MessageBox(0,"建立与Telnet服务器的sock失败","错误",MB_OK);
}
if(connect(hServer,(PSOCKADDR)&SockAddr,sizeof(SockAddr)))
{
MessageBox(0,"Error connecting to Server socket","Error",MB_OK);
return (1);
}
memset(szBuffer,0,sizeof(szBuffer));
recv(hServer,szBuffer,sizeof(szBuffer),0);
printf("%s\n",szBuffer);
Sleep(5000);
wsprintf(szMsgLine,"help%s",EOL);
GetTelnetEcho(hServer,szMsgLine);
Sleep(5000);
wsprintf(szMsgLine,"user%s",EOL); GetTelnetEcho(hServer,szMsgLine);
Sleep(5000);
wsprintf(szMsgLine,"ls%s",EOL);
GetTelnetEcho(hServer,szMsgLine);
closesocket(hServer);
WSACleanup();
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
TelnetTest(argc,argv);
return nRetCode;
}