Hi,
I have developed the following code. I have to download .pdb file from the ftp
server. I have given a dummy server name, username and password in this code.
I do have doubt in following areas.
NetLibSocketConnect returns with netErrTimeout. Is my code timing out for not
passing the username and password for logging in? How to send the username and
password? Also, advice if i went wrong in any place?
void FTPSocketOpen()
{
Err error;
Int16 ret;
NetSocketRef sockRef;
NetSocketLingerType lin;
Int32 timeout = TCP_TIMEOUT;
timeout = 5000;
NetIPAddr ipAddr;
NetIPAddr* addrIP = NULL;
char aug[50];
NetHostInfoBufPtr hostInfoBufP = NULL;
NetHostInfoPtr hostInfoP = NULL;
NetServInfoBufPtr servInfoBufP = NULL;
NetServInfoPtr servInfoP = NULL;
UInt16 port = 0;
NetSocketAddrType* addrP;
UInt16 resCode = 0; // Result from socket functions.
sockRef = NetLibSocketOpen(NetLibRefNum,
netSocketAddrINET,netSocketTypeStream,netSocketProtoIPTCP, timeout, &error);
if(error)
{
NetLibSocketClose(NetLibRefNum, sockRef,timeout, &error);
FrmCustomAlert(kAlert,"Error opening socket.",NULL,NULL);
}
else
{
/* set to non-blocking socket */
lin.onfiltered= true;
lin.time = 0;
/* set linger */
ret = NetLibSocketOptionSet(NetLibRefNum, sockRef,
netSocketOptLevelSocket,netSocketOptSockLinger, &lin, sizeof(lin),timeout,
&error);
FrmCustomAlert(kAlert,"Socket option set.",NULL,NULL);
// Allocate host info buffer.
hostInfoBufP = (NetHostInfoBufPtr) MemPtrNew (sizeof
(NetHostInfoBufType));
hostInfoP=NetLibGetHostByName(NetLibRefNum,"ftp.venkat.server.com",hostInfoBufP,timeout,&error);
if (hostInfoP)
{
addrIP = (NetIPAddr*) hostInfoP->addrListP [0];
ipAddr=NetNToHL (*addrIP);
FrmCustomAlert(kAlert,"hostInfoP->nameP:",hostInfoP->nameP,StrIToA(aug,ipAddr));
}
// Free host info buffer.
MemPtrFree (hostInfoBufP);
// Get the service information.
// Allocate service info buffer.
servInfoBufP = (NetServInfoBufPtr) MemPtrNew (sizeof
(NetServInfoBufType));
servInfoP = NetLibGetServByName (NetLibRefNum,
"ftp",
"tcp",
servInfoBufP,
timeout,
&error);
// Check if service retrieved.
if (servInfoP)
{
// Service retrieved, set return value
// (Convert from network to host byte order).
port = NetNToHS (servInfoP->port);
FrmCustomAlert(kAlert,"Service
Retrieved:",servInfoP->nameP,StrIToA(aug,servInfoP->port));
}
else
{
FrmCustomAlert(kAlert,"Error retrieving service.",NULL,NULL);
}
// Free service name buffer.
MemPtrFree (servInfoBufP);
// Populate address structure.
addrP->family = netSocketAddrINET;
//addrP->port = NetHToNS (port);
//addrP->addr = NetHToNL (ipAddr);
// Attempt to connect.
resCode = NetLibSocketConnect (NetLibRefNum,
sockRef,
addrP,
sizeof (addrP),
timeout,
&error);
if(resCode!=0)
{
if(error==netErrTimeout)
FrmCustomAlert(kAlert,"netErrTimeout - Error opening
socket.",NULL,NULL);
else if(error==netErrNotOpen)
FrmCustomAlert(kAlert,"netErrNotOpen - Error opening
socket.",NULL,NULL);
else if(error==netErrParamErr)
FrmCustomAlert(kAlert,"netErrParamErr - Error opening
socket.",NULL,NULL);
else if(error==netErrSocketNotOpen)
FrmCustomAlert(kAlert,"netErrSocketNotOpen - Error opening
socket.",NULL,NULL);
else if(error==netErrSocketBusy)
FrmCustomAlert(kAlert,"netErrSocketBusy - Error opening
socket.",NULL,NULL);
else if(error==netErrNoInterfaces)
FrmCustomAlert(kAlert,"netErrNoInterfaces - Error opening
socket.",NULL,NULL);
else if(error==netErrPortInUse)
FrmCustomAlert(kAlert,"netErrPortInUse - Error opening
socket.",NULL,NULL);
else if(error==netErrQuietTimeNotElapsed)
FrmCustomAlert(kAlert,"netErrQuietTimeNotElapsed - Error
opening socket.",NULL,NULL);
else if(error==netErrInternal)
FrmCustomAlert(kAlert,"netErrInternal - Error opening
socket.",NULL,NULL);
else if(error==netErrSocketAlreadyConnected)
FrmCustomAlert(kAlert,"netErrSocketAlreadyConnected - Error
opening socket.",NULL,NULL);
else if(error==netErrSocketClosedByRemote)
FrmCustomAlert(kAlert,"netErrSocketClosedByRemote - Error
opening socket.",NULL,NULL);
else if(error==netErrTooManyTCPConnections)
FrmCustomAlert(kAlert,"netErrTooManyTCPConnections - Error
opening socket.",NULL,NULL);
else if(error==netErrWouldBlock)
FrmCustomAlert(kAlert,"netErrWouldBlock - Error opening
socket.",NULL,NULL);
else if(error==netErrWrongSocketType)
FrmCustomAlert(kAlert,"netErrWrongSocketType - Error opening
socket.",NULL,NULL);
else if(error==netErrOutOfCmdBlocks)
FrmCustomAlert(kAlert,"netErrOutOfCmdBlocks - Error opening
socket",NULL,NULL);
}
else
{
FrmCustomAlert(kAlert,"Socket Opened.",NULL,NULL);
}
// Shut down the socket for both send and receive.
// (At this point we don't have to worry about direction).
NetLibSocketShutdown (NetLibRefNum,sockRef,netSocketDirBoth,timeout,
&error);
NetLibSocketClose(NetLibRefNum, sockRef,timeout, &error);
FrmCustomAlert(kAlert,"Socket terminated.",NULL,NULL);
}
}
void FTPNetDownlaod()
{
FTPSocketOpen();
}
void FTPNetFind()
{
Err err;
// Find the net library.
err = SysLibFind ("Net.lib", &NetLibRefNum);
if(err!=0)
FrmCustomAlert(kAlert,"NetLib not found",NULL,NULL);
else
FrmCustomAlert(kAlert,"NetLib found",NULL,NULL);
}
void FTPNetOpen()
{
Err err;
UInt16 ifErrs = 0; // NetLib Open - Interface errors.
UInt32 ifCreator;
UInt16 ifInstance;
Char text[32];
UInt16 buflen;
// If there are no interfaces attached, print error message
err = NetLibIFGet(NetLibRefNum, 0, &ifCreator, &ifInstance);
StrCopy(text,"venkat");
buflen=sizeof(text);
err = NetLibIFSettingSet
(NetLibRefNum,ifCreator,ifInstance,netIFSettingAuthUsername,text,buflen);
StrCopy(text,"venkat");
buflen=sizeof(text);
err = NetLibIFSettingSet
(NetLibRefNum,ifCreator,ifInstance,netIFSettingAuthPassword,text,buflen);
// Open the Net Library.
err = NetLibOpen (NetLibRefNum, &ifErrs);
if (!err)
{
//FrmCustomAlert(kAlert,"NetLib Opened",NULL,NULL);
}
else if (netErrAlreadyOpen == err)
FrmCustomAlert(kAlert,"NetLib already opened",NULL,NULL);
else
FrmCustomAlert(kAlert,"Error opening NetLib.",NULL,NULL);
// Check if any interface errors occurred.
if (ifErrs)
FrmCustomAlert(kAlert,"NetLib OPEN - One or more interface
errors.",NULL,NULL);
if(!err && !ifErrs)
{
FTPNetDownlaod();
}
}
void FTPNetClose()
{
Err err;
// Close the Net Library.
err = NetLibClose (NetLibRefNum, false);
if (netErrNotOpen == err)
FrmCustomAlert(kAlert,"NetLib not opened.",NULL,NULL);
else if (netErrStillOpen == err)
FrmCustomAlert(kAlert,"NetLib Still Open.",NULL,NULL);
// Now close the net lib.
NetLibFinishCloseWait (NetLibRefNum);
// Draw current state.
FrmCustomAlert(kAlert,"NetLib Closed.",NULL,NULL);
}
void FTPCommand()
{
FTPNetFind();
FTPNetOpen();
FTPNetClose();
}
void FTPMain()
{
FTPCommand();
}
--
For information on using the PalmSource Developer Forums, or to unsubscribe,
please see http://www.palmos.com/dev/support/forums/