当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>用C++ Builderw做Ftp服务器程序</b>[VC/C++编程]

赞助商链接



  本文“<b>用C++ Builderw做Ftp服务器程序</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

#include <stdlib.h> //Required for atoi()
#include "..\winsock.h" //Winsock header file
#define PROG_NAME  "Quick FTP Version 1"
#define HOST_NAME  "NIC.DDN.MIL " // FTP server host
#define PASSWORD   "PASS guest\r\n " // Password for FTP server host
#define WINSOCK_VERSION  0x0101   // Program requires Winsock version 1.1
#define DEFAULT_PROTOCOL 0  // No protocol specified, use default
#define NO_FLAGS 0  // No special flags specified
char szCommandBuffer[100]; // Buffer for FTP commands
LPSTR lpszFunctionName; // Pointer for function names
UINT GetReplyCode(LPSTR lpszServerReply)
{
  UINT nCode; // Reply code as a number
  char c; // Temporary storage
  // lpszFunctionName = "GetReplyCode ";
  c = *(lpszServerReply+3); // Save the character
  *(lpszServerReply+3) = '\0'; // Terminate the code
  nCode = atoi((const char *)lpszServerReply); // Convert code to number
  *(lpszServerReply+3) = c; // Restore the character
  return(nCode); // Return the reply code
}
UINT ReadFTPServerReply(SOCKET hControlChannel)
{
  char sReceiveBuffer[1024]; // Data-storage buffer for FTP server reply
  int iLength; // Length of data received from FTP server

  lpszFunctionName = "ReadFTPServerReply ";
   if ((iLength = recv(hControlChannel, (LPSTR)sReceiveBuffer,
sizeof(sReceiveBuffer), NO_FLAGS)) == SOCKET_ERROR)
   {
   int iWinsockErr = WSAGetLastError();
   wsprintf(szCommandBuffer,"Error %d from the recv() function!! ",
iWinsockErr);
   MessageBeep(MB_ICONHAND);
   MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
// Return 999 to indicate an error has occurred
   return(999);
}

  sReceiveBuffer[iLength] = '\0';
  MessageBeep(MB_ICONASTERISK);
  MessageBox(NULL, (LPSTR)sReceiveBuffer, lpszFunctionName,MB_OK |MB_ICONINFORMATION);
  // Extract the reply code from the server reply and return as an integer
  return(GetReplyCode(sReceiveBuffer));
}

UINT SendFTPCommand(SOCKET hControlChannel, LPSTR szCommandBuffer)
{
  lpszFunctionName = "SendFTPCommand ";
  // Send the FTP command
  if ((send(hControlChannel, (LPSTR)szCommandBuffer,
lstrlen(szCommandBuffer), NO_FLAGS)) == SOCKET_ERROR)
{
   int iWinsockErr = WSAGetLastError();
   wsprintf(szCommandBuffer, "Error %d from the send() function!! ",
iWinsockErr);
   MessageBeep(MB_ICONHAND);
   MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
// Return 999 to indicate an error has occurred
   return(999);
}

  // Read the server's reply and return the reply code as an integer
  return(ReadFTPServerReply(hControlChannel));
}

UINT AnonymousFTPLogIn(SOCKET hControlSocket)
{
  int nReplyCode; // FTP server reply code
  int iMsg = 0; // Index subscript for FTP commands

  lpszFunctionName = "AnonymousFTPLogIn ";
  char *LoginCommand[]={"USER anonymous\r\n ",PASSWORD,NULL};
  do
   {
   nReplyCode = SendFTPCommand(hControlSocket,(LPSTR)LoginCommand[iMsg++]);
   }
  while(LoginCommand[iMsg] && nReplyCode < 400);
  return(nReplyCode);
}
SOCKET ConnectFTPControlSocket(LPSTR lpszHost)
{
  LPHOSTENT lpHostEnt; // Internet host information structure
  SOCKADDR_IN sockAddr; // Socket address structure
  LPSERVENT lpServEnt; // Service information structure
  short nProtocolPort; // Protocol port
  int nConnect; // Socket connection results
  SOCKET hControlSocket; // Control socket handle

  lpszFunctionName = "ConnectFTPControlSocket ";
  if (!(lpHostEnt = gethostbyname(lpszHost)))
{
   int iWinsockErr = WSAGetLastError();
   wsprintf(szCommandBuffer,"Error #%d while resolving address for %s ",
iWinsockErr, lpszHost);
   MessageBeep(MB_ICONHAND);
   MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
   return(INVALID_SOCKET);
}

  if ((hControlSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))
== INVALID_SOCKET)
{
   int iWinsockErr = WSAGetLastError();
   wsprintf(szCommandBuffer,"Error #%d occurred while creating socket!! ",
iWinsockErr);
   MessageBeep(MB_ICONHAND);
   MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
   return(INVALID_SOCKET);
}

  lpServEnt = getservbyname( "ftp ", DEFAULT_PROTOCOL);

  if (lpServEnt == NULL)
   nProtocolPort = htons(IPPORT_FTP);
  else
   nProtocolPort = lpServEnt- >s_port;
  // Define the socket address
  sockAddr.sin_family = AF_INET;
  sockAddr.sin_port = nProtocolPort;
  sockAddr.sin_addr = *((LPIN_ADDR)*lpHostEnt- >h_addr_list);

  // Connect the socket
  if( nConnect = connect(hControlSocket, (LPSOCKADDR)&sockAddr,
sizeof(sockAddr)))
{
   int iWinsockErr = WSAGetLastError();
   wsprintf(szCommandBuffer,
     "Error #%d occurred while connecting socket!! ",
iWinsockErr);
   MessageBeep(MB_ICONHAND);
   MessageBox(NULL, szCommandBuffer, lpszFunctionName,
MB_OK |MB_ICONSTOP);
   return(INVALID_SOCKET);
}

  if (ReadFTPServerReply(hControlSocket) >= 400)
return(INVALID_SOCKET);
  else
return(hControlSocket);
}
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
  WSADATA wsaData; // Winsock implementation details
  SOCKET hControlChannel; // Socket handle for the control channel
  UINT nReplyCode; // FTP reply code
  lpszFunctionName = "WinMain ";

  if (WSAStartup(WINSOCK_VERSION, &wsaData))
{
   MessageBeep(MB_ICONHAND);
   MessageBox(NULL, "Could not load Windows Sockets DLL. ",
lpszFunctionName, MB_OK |MB_ICONSTOP);
   return(NULL);
}

  hControlChannel = ConnectFTPControlSocket((LPSTR)HOST_NAME);
  // Note that from a DLL, here we would return
  // our control channel handle (if valid) for
  // use by other program modules.
  if (hControlChannel != INVALID_SOCKET)
{
   // If we have a control channel, then login.
   nReplyCode = AnonymousFTPLogIn(hControlChannel);

   if (nReplyCode == 230) // User logged in; we can proceed.
{
    SendFTPCommand(hControlChannel, "QUIT\r\n ");
    closesocket(hControlChannel);
}
}

  WSACleanup();
  MessageBeep(MB_ICONEXCLAMATION);
  MessageBox(NULL, "THE END!! ", PROG_NAME, MB_OK |MB_ICONEXCLAMATION);
  return(NULL);
}


  以上是“<b>用C++ Builderw做Ftp服务器程序</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .