/*************************************************************************** Windows Sockets Client Application Support Module Written by: John A. Junod Internet: 267 Hillwood Street Martinez, GA 30907 Compuserve: 72321,366 This program executable and all source code is released into the public domain. It would be nice (but is not required) to give me a little credit for any use of this code. THE INFORMATION AND CODE PROVIDED IS PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL JOHN A. JUNOD BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF JOHN A. JUNOD HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. *****************************************************************************/ /* MODULE: WS_IP.C Based on code published in UNIX Network Programming by W. Richard Stevens These are common routines that will be needed by many different programs and should not be modified for a specific instance. */ #include "ws_glob.h" #include "ws_ftp.h" #include volatile SOCKET connectTCP(char *host,char *service) { return connectsock(host,service,"tcp"); } volatile SOCKET connectUDP(char *host,char *service) { return connectsock(host,service,"udp"); } volatile SOCKET connectsock(char *host,char *service,char *protocol) { struct hostent *pHostEntry; // pointer to host entry struct servent FAR *pServiceEntry; // pointer to service entry struct protoent FAR *pProtoEntry; // pointer to protocol entry volatile SOCKET sSocket; // socket int nSocketType; // socket type short pproto; int iFlag=1; DoPrintf(" "); // initialize socket address structure memset((char *)&saSockAddr,0,sizeof(saSockAddr)); saSockAddr.sin_family=AF_INET; // get service port number from name if(pServiceEntry=getservbyname(service,protocol)) { if (uiFtpPort != 21) { DoPrintf("Overridding Ftp port number with %u",uiFtpPort); saSockAddr.sin_port=htons((u_short)uiFtpPort); } else saSockAddr.sin_port=pServiceEntry->s_port; } else if((saSockAddr.sin_port=htons((u_short)atoi(service)))==0) { // lgk new code first try user interface setting if different than 21 if (uiFtpPort != 21) { DoPrintf("Overridding Ftp port number with %u",uiFtpPort); saSockAddr.sin_port=htons((u_short)uiFtpPort); } else { if(strcmpi(service,"FTP")==0) saSockAddr.sin_port=htons(21); else { DoPrintf("can't get \"%s\" service entry",service); return INVALID_SOCKET; } } } // map host to ip, allow ip if(pHostEntry=gethostbyname(host)) memcpy((char *)&saSockAddr.sin_addr,pHostEntry->h_addr, pHostEntry->h_length); // memcpy(pHostEntry->h_addr,(char *)&saSockAddr.sin_addr,pHostEntry->h_length); else if((saSockAddr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE) { DoPrintf("can't get \"%s\" host entry",host); return INVALID_SOCKET; } // map protocol name to protocol number if((pProtoEntry=getprotobyname(protocol))==0) { if(strcmpi(protocol,"TCP")==0) pproto=6; else { DoPrintf("can't get \"%s\" protocol entry",protocol); return INVALID_SOCKET; } } else pproto=pProtoEntry->p_proto; // use protocol to choose socket type if(strcmp(protocol,"udp")==0) nSocketType=SOCK_DGRAM; else nSocketType=SOCK_STREAM; // allocate a socket sSocket=socket(AF_INET,nSocketType,pproto); if(sSocket==INVALID_SOCKET) { ReportWSError("create socket",WSAGetLastError()); return INVALID_SOCKET; } // lgk set for reuse if(setsockopt(sSocket,SOL_SOCKET,SO_REUSEADDR, (char *)&iFlag,sizeof(iFlag))==SOCKET_ERROR) { ReportWSError("setsockopt",WSAGetLastError()); closesocket(data_socket); return INVALID_SOCKET; } memcpy((LPSTR)&saSockAddr1,(LPSTR)&saSockAddr,sizeof(saSockAddr)); saSockAddr1.sin_port=htons(20); DoPrintf("connecting to %s ...",inet_ntoa(saSockAddr.sin_addr)); // connect the socket if(connect(sSocket,(struct sockaddr *)&saSockAddr,sizeof(saSockAddr)) ==SOCKET_ERROR) { DoPrintf("Can't connect to %s %s service port %u.",host,service,ntohs(saSockAddr.sin_port)); ReportWSError("Connect failed -",WSAGetLastError()); return INVALID_SOCKET; } DoPrintf("Connected to %s port %u", inet_ntoa(saSockAddr.sin_addr),ntohs(saSockAddr.sin_port)); return sSocket; } int sendstr(SOCKET sSocket,LPSTR pBuf,int nBytesToWrite) { int nBytesLeft,nWritten; nBytesLeft=nBytesToWrite; while(nBytesLeft > 0) { // while we haven't written enough nWritten=send(sSocket,pBuf,((nBytesLeft>1024)?1024:nBytesLeft),0); // write what we can // DoPrintf("[%u] %u send %u",sSocket,nBytesLeft,nWritten); if(nWritten <= 0) { DoPrintf("[%u] %u send %u",sSocket,nBytesLeft,nWritten); ReportWSError("send",WSAGetLastError()); return(nWritten); // error occured } nBytesLeft -= nWritten; // count what we wrote pBuf += nWritten; // adjust buffer pointer } return(nBytesToWrite - nBytesLeft); // return count of bytes written }