home *** CD-ROM | disk | FTP | other *** search
/ Borland Programmer's Resource / Borland_Programmers_Resource_CD_1995.iso / winsock / wsftp32 / ws_ip.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-19  |  5.6 KB  |  164 lines

  1. /***************************************************************************
  2.   Windows Sockets Client Application Support Module
  3.  
  4.   Written by:
  5.       John A. Junod             Internet: <junodj@gordon-emh2.army.mil>
  6.       267 Hillwood Street                 <zj8549@trotter.usma.edu>
  7.       Martinez, GA 30907      Compuserve: 72321,366 
  8.  
  9.   This program executable and all source code is released into the public
  10.   domain.  It would be nice (but is not required) to give me a little 
  11.   credit for any use of this code.
  12.  
  13.   THE INFORMATION AND CODE PROVIDED IS PROVIDED AS IS WITHOUT WARRANTY 
  14.   OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  15.   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  16.   PURPOSE. IN NO EVENT SHALL JOHN A. JUNOD BE LIABLE FOR ANY DAMAGES 
  17.   WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS 
  18.   OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF JOHN A. JUNOD HAS BEEN 
  19.   ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  20.  
  21. *****************************************************************************/
  22. /*
  23.   MODULE: WS_IP.C
  24.  
  25.   Based on code published in UNIX Network Programming by W. Richard Stevens
  26.  
  27.   These are common routines that will be needed by many different programs
  28.   and should not be modified for a specific instance.
  29. */
  30. #include "ws_glob.h"
  31. #include "ws_ftp.h"
  32. #include <stdlib.h>
  33.  
  34. volatile SOCKET connectTCP(char *host,char *service)
  35. {
  36.   return connectsock(host,service,"tcp");
  37. }
  38.  
  39. volatile SOCKET connectUDP(char *host,char *service)
  40. {
  41.   return connectsock(host,service,"udp");
  42. }
  43.  
  44. volatile SOCKET connectsock(char *host,char *service,char *protocol)
  45. {
  46.   struct hostent *pHostEntry;      // pointer to host entry
  47.   struct servent FAR *pServiceEntry;   // pointer to service entry
  48.   struct protoent FAR *pProtoEntry;    // pointer to protocol entry
  49.   volatile SOCKET sSocket;                  // socket
  50.   int nSocketType;                 // socket type
  51.   short pproto;
  52.   int iFlag=1;
  53.  
  54.   DoPrintf("  ");
  55.   // initialize socket address structure
  56.   memset((char *)&saSockAddr,0,sizeof(saSockAddr));
  57.   saSockAddr.sin_family=AF_INET;
  58.   // get service port number from name
  59.   if(pServiceEntry=getservbyname(service,protocol))
  60.     {
  61.     if (uiFtpPort != 21)
  62.       {
  63.        DoPrintf("Overridding Ftp port number with %u",uiFtpPort);
  64.        saSockAddr.sin_port=htons((u_short)uiFtpPort);
  65.       }
  66.     else saSockAddr.sin_port=pServiceEntry->s_port;
  67.     }
  68.  else if((saSockAddr.sin_port=htons((u_short)atoi(service)))==0)
  69.     {
  70. //  lgk new code first try user interface setting if different than 21
  71.     if (uiFtpPort != 21)
  72.       {
  73.        DoPrintf("Overridding Ftp port number with %u",uiFtpPort);
  74.        saSockAddr.sin_port=htons((u_short)uiFtpPort);
  75.       }
  76.     else
  77.      {
  78.    
  79.        if(strcmpi(service,"FTP")==0)
  80.           saSockAddr.sin_port=htons(21);
  81.        else {
  82.           DoPrintf("can't get \"%s\" service entry",service);
  83.          return INVALID_SOCKET;
  84.        }
  85.      }
  86.   }
  87.   // map host to ip, allow ip
  88.   if(pHostEntry=gethostbyname(host))
  89.     memcpy((char *)&saSockAddr.sin_addr,pHostEntry->h_addr,
  90.              pHostEntry->h_length);
  91. //  memcpy(pHostEntry->h_addr,(char *)&saSockAddr.sin_addr,pHostEntry->h_length);
  92.   else if((saSockAddr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE) {
  93.     DoPrintf("can't get \"%s\" host entry",host);
  94.     return INVALID_SOCKET;
  95.   }
  96.   // map protocol name to protocol number
  97.   if((pProtoEntry=getprotobyname(protocol))==0) {
  98.     if(strcmpi(protocol,"TCP")==0)
  99.       pproto=6;
  100.     else {
  101.       DoPrintf("can't get \"%s\" protocol entry",protocol);
  102.       return INVALID_SOCKET;
  103.     }
  104.   } else pproto=pProtoEntry->p_proto;
  105.   // use protocol to choose socket type
  106.   if(strcmp(protocol,"udp")==0)
  107.     nSocketType=SOCK_DGRAM;
  108.   else
  109.     nSocketType=SOCK_STREAM;
  110.   // allocate a socket
  111.   sSocket=socket(AF_INET,nSocketType,pproto);
  112.   if(sSocket==INVALID_SOCKET) 
  113.   {
  114.     ReportWSError("create socket",WSAGetLastError());
  115.     return INVALID_SOCKET;
  116.   }
  117.       // lgk set for reuse
  118.       if(setsockopt(sSocket,SOL_SOCKET,SO_REUSEADDR,
  119.          (char *)&iFlag,sizeof(iFlag))==SOCKET_ERROR)
  120.       {
  121.         ReportWSError("setsockopt",WSAGetLastError());
  122.         closesocket(data_socket);
  123.         return INVALID_SOCKET;
  124.       }
  125.    
  126.   memcpy((LPSTR)&saSockAddr1,(LPSTR)&saSockAddr,sizeof(saSockAddr));
  127.   saSockAddr1.sin_port=htons(20);
  128.  
  129.   DoPrintf("connecting to %s ...",inet_ntoa(saSockAddr.sin_addr));
  130.   // connect the socket
  131.   if(connect(sSocket,(struct sockaddr *)&saSockAddr,sizeof(saSockAddr))
  132.       ==SOCKET_ERROR) {
  133.     DoPrintf("Can't connect to %s %s service port %u.",host,service,ntohs(saSockAddr.sin_port));
  134.     ReportWSError("Connect failed -",WSAGetLastError());
  135.     return INVALID_SOCKET;
  136.   }
  137.  
  138.   DoPrintf("Connected to %s port %u",
  139.     inet_ntoa(saSockAddr.sin_addr),ntohs(saSockAddr.sin_port));
  140.  
  141.   return sSocket;
  142. }
  143.  
  144. int sendstr(SOCKET sSocket,LPSTR pBuf,int nBytesToWrite)
  145. {
  146.   int nBytesLeft,nWritten;
  147.  
  148.   nBytesLeft=nBytesToWrite;
  149.   while(nBytesLeft > 0) {                   // while we haven't written enough
  150.     nWritten=send(sSocket,pBuf,((nBytesLeft>1024)?1024:nBytesLeft),0); // write what we can
  151.     // DoPrintf("[%u] %u send %u",sSocket,nBytesLeft,nWritten);
  152.   if(nWritten <= 0)
  153.     {
  154.       DoPrintf("[%u] %u send %u",sSocket,nBytesLeft,nWritten);
  155.       ReportWSError("send",WSAGetLastError());
  156.       return(nWritten);  // error occured
  157.     }
  158.     nBytesLeft -= nWritten;                 // count what we wrote
  159.     pBuf   += nWritten;                     // adjust buffer pointer
  160.   }
  161.   return(nBytesToWrite - nBytesLeft);       // return count of bytes written
  162. }
  163.  
  164.