WS_IP.C
上传用户:dansui
上传日期:2007-01-04
资源大小:71k
文件大小:5k
源码类别:

Ftp客户端

开发平台:

WINDOWS

  1. /*
  2.   MODULE: WinFTP.C
  3.   Based on code published in UNIX Network Programming by W. Richard Stevens
  4.   These are common routines that will be needed by many different programs
  5.   and should not be modified for a specific instance.
  6. */
  7. #include "ws_glob.h"
  8. #include "winftp.h"
  9. #include <stdlib.h>
  10. SOCKET connectTCP(char *host,char *service)
  11. {
  12.   return connectsock(host,service,"tcp");
  13. }
  14. SOCKET connectUDP(char *host,char *service)
  15. {
  16.   return connectsock(host,service,"udp");
  17. }
  18. //*********************************************************************
  19. //*********************************************************************
  20. GetDefaultService (LPSTR lpServ)
  21. {
  22.   if (lstrcmpi (lpServ, "ftp")==0) return 21;
  23.   return -1;
  24. }
  25. //*********************************************************************
  26. //*********************************************************************
  27. GetDefaultProtocol (LPSTR lpProto)
  28. {
  29.   if (lstrcmpi (lpProto, "tcp")==0) return 6;
  30.   return -1;
  31. }
  32. //*********************************************************************
  33. //*********************************************************************
  34. SOCKET connectsock (LPSTR host, LPSTR service, LPSTR protocol)
  35. {
  36.   struct hostent *pHostEntry;      // pointer to host entry
  37.   struct servent *pServiceEntry;   // pointer to service entry
  38.   struct protoent *pProtoEntry;    // pointer to protocol entry
  39.   SOCKET sSocket;                  // socket
  40.   int nSocketType;                 // socket type
  41.   short nProtocol;                 // protocol value
  42.   // initialize socket address structure
  43.   // get service port number from name
  44.   memset((char *)&saSockAddr,0,sizeof(saSockAddr));
  45.   saSockAddr.sin_family=AF_INET;
  46.   if (pServiceEntry=getservbyname(service,protocol))
  47.     saSockAddr.sin_port=pServiceEntry->s_port;
  48.   else if ((saSockAddr.sin_port=htons((u_short)atoi(service)))==0) 
  49.   {
  50.     DoPrintf ("can't get "%s" service entry, will use default",service);
  51.     saSockAddr.sin_port = htons ((u_short) GetDefaultService (service));
  52.   }
  53.   // map host to ip, allow ip
  54.   if (pHostEntry=gethostbyname(host))
  55.   {
  56.     memcpy((char *)&saSockAddr.sin_addr,pHostEntry->h_addr,pHostEntry->h_length);
  57.   }
  58.   else if((saSockAddr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE) 
  59.   {
  60.     DoPrintf("can't get "%s" host entry",host);
  61.     return INVALID_SOCKET;
  62.   }
  63.   // map protocol name to protocol number
  64.   // use protocol to choose socket type
  65.   if ((pProtoEntry=getprotobyname(protocol))==0) 
  66.   {
  67.     DoPrintf("can't get "%s" protocol entry, will use default", protocol);
  68.     nProtocol = GetDefaultProtocol (protocol);
  69.     if (nProtocol==-1)  return INVALID_SOCKET;
  70.   }
  71.   else 
  72.   {
  73.    nProtocol = pProtoEntry->p_proto;
  74.   }
  75.   // DoPrintf ("Protocol is %s, value %d", protocol, pProtoEntry->p_proto);
  76.   if (strcmp (protocol,"udp")==0)
  77.     nSocketType = SOCK_DGRAM;
  78.   else
  79.     nSocketType = SOCK_STREAM;
  80.   // allocate a socket
  81.   sSocket = socket (AF_INET, nSocketType, nProtocol);
  82.   if (sSocket==INVALID_SOCKET) 
  83.   {
  84.     ReportWSError("create socket",WSAGetLastError());
  85.     return INVALID_SOCKET;
  86.   }
  87.   memcpy ((LPSTR)&saSockAddr1, (LPSTR)&saSockAddr, sizeof (saSockAddr));
  88.   saSockAddr1.sin_port=htons(20);
  89.   // connect the socket
  90.   if (connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr))
  91.       ==SOCKET_ERROR) {
  92.     DoPrintf("Can't connect to %s %s service.", host, service);
  93.     ReportWSError (NULL,WSAGetLastError());
  94.     return INVALID_SOCKET;
  95.   }
  96.   DoPrintf ("Connected to %s port %u",
  97.     inet_ntoa (saSockAddr.sin_addr), ntohs (saSockAddr.sin_port));
  98.   return sSocket;
  99. }
  100. //*********************************************************************
  101. //*********************************************************************
  102. int sendstr (SOCKET sSocket, LPSTR pBuf, int nBytesToWrite, int *lpnRetCode)
  103. {
  104.   int nBytesLeft, nBytesWritten, nError;
  105.   nBytesLeft = nBytesToWrite;
  106.   
  107.   // while we haven't written enough or transfer has not been aborted
  108.   // send out the data 
  109.   while (nBytesLeft > 0)
  110.   {                   
  111.     nBytesWritten = send (sSocket, pBuf, nBytesLeft,0); // write what we can
  112.     if (nBytesWritten==SOCKET_ERROR) 
  113.     {
  114.       ReportWSError ("Send", nError = WSAGetLastError());
  115.       *lpnRetCode = (bAborted) ? FTP_ABORT : FTP_ERROR;
  116.       return nBytesWritten;  // error occured
  117.     }
  118.     nBytesLeft -= nBytesWritten;                 // count what we wrote
  119.     pBuf   += nBytesWritten;                     // adjust buffer pointer
  120.     if (bAborted)
  121.     {
  122.        break;
  123.     }
  124.   }
  125.   if (bAborted) *lpnRetCode = FTP_ABORT;
  126.   else *lpnRetCode = FTP_COMPLETE;
  127.   return (nBytesToWrite - nBytesLeft);       // return count of bytes written
  128. }