<br>I am attaching a program . please go thru it to get a particular information. <br><br>Thanx<br>Siddhartha Singh<br><A HREF="mailto:ssingh@aztecsoft.com">ssingh@aztecsoft.com</A><br><br><br>/* This module contains the functions that deal with the FTP <br> * data connection (for sending and receiving data between <br> * client and server to service LIST, RECV and STOR commands). <br> * <br> ---------------------------------------------------------------------*/ <br> #include "..\wsa_xtra.h" <br> #include <windows.h> <br> #include <windowsx.h> <br> #include "..\winsockx.h" <br><br> #include <string.h> /* for _fmemcpy() & _fmemset() */ <br> #include <stdlib.h> /* for _ltoa() */ <br> #include <winsock.h> <br> #include "resource.h" <br> #include <direct.h> /* for Microsoft find file structure */ <br> #include "ac_<A HREF="ftp://ftp.h"" TARGET="_new">ftp.h"</A>; <br><br> /*-------------------------------------------------------------- <br> * Function: InitDataConn() <br> * <br> * Description: Set up a listening socket for a data connection <br> */ <br> SOCKET InitDataConn(PSOCKADDR_IN lpstName, HWND hDlg, u_int<br> nAsyncMsg) <br> { <br> int nRet; <br> SOCKET hLstnSock; <br> int nLen = SOCKADDR_LEN; <br><br> if (bDebug) { <br> wsprintf(achTempBuf, <br> "InitDataConn() Qlen:%d Cmd[0]:%d [1]:%d [2]:%d [3]:%d, State:%d\n", <br> nQLen, astFtpCmd[0].nFtpCmd, astFtpCmd[1].nFtpCmd, <br> astFtpCmd[2].nFtpCmd, astFtpCmd[3].nFtpCmd, nAppState); <br> OutputDebugString (achTempBuf); <br> } <br> lByteCount = 0; /* init byte counter */ <br><br> /* Get a TCP socket to use for data connection listen*/ <br> hLstnSock = socket (AF_INET, SOCK_STREAM, 0); <br> if (hLstnSock == INVALID_SOCKET) { <br> WSAperror(WSAGetLastError(), "socket()", hInst); <br> } else { <br> /* Request async notification for most events */ <br> nRet = WSAAsyncSelect(hLstnSock, hDlg, nAsyncMsg, <br> (FD_ACCEPT ¦ FD_READ ¦ FD_WRITE ¦ FD_CLOSE)); <br> if (nRet == SOCKET_ERROR) { <br> WSAperror(WSAGetLastError(), "WSAAsyncSelect()", hInst); <br> } else { <br><br> /* Name the local socket with bind() */ <br> lpstName->sin_family = PF_INET; <br> lpstName->sin_port = 0; /* any port will do */ <br> nRet = bind(hLstnSock,(LPSOCKADDR)lpstName,SOCKADDR_LEN); <br> if (nRet == SOCKET_ERROR) { <br> WSAperror(WSAGetLastError(), "bind()", hInst); <br> } else { <br><br> /* Get local port number assigned by bind() */ <br> nRet = getsockname(hLstnSock,(LPSOCKADDR)lpstName, <br> (int FAR *)&nLen); <br> if (nRet == SOCKET_ERROR) { <br> WSAperror(WSAGetLastError(), "getsockname()", hInst); <br> } else { <br><br> /* Listen for incoming connection requests */ <br> nRet = listen(hLstnSock, 5); <br> if (nRet == SOCKET_ERROR) { <br> WSAperror(WSAGetLastError(), "listen()", hInst); <br> } <br> } <br> } <br> } <br> /* If we haven't had an error but we still don't know the local <br> * IP address, then we need to try to get it before we return */ <br> if (!lpstName->sin_addr.s_addr) { <br> lpstName->sin_addr.s_addr = GetHostID(); <br> if (!lpstName->sin_addr.s_addr) { <br> MessageBox (hDlg, "Can't get local IP address", <br> "InitDataConn() Failed", MB_OK ¦ MB_ICONASTERISK); <br> nRet = SOCKET_ERROR; <br> } <br> } <br> /* If we had an error or we still don't know our IP address, <br> * then we have a problem. Clean up */ <br> if (nRet == SOCKET_ERROR) { <br> closesocket(hLstnSock); <br> hLstnSock = INVALID_SOCKET; <br> } <br> } <br> return (hLstnSock); <br> } /* end InitDataConn() */ <br><br> /*-------------------------------------------------------------- <br> * Function: AcceptDataConn() <br> * <br> * Description: Accept an incoming data connection <br> */ <br> SOCKET AcceptDataConn(SOCKET hLstnSock, PSOCKADDR_IN pstName) <br> { <br> SOCKET hDataSock; <br> int nRet, nLen = SOCKADDR_LEN, nOptval; <br><br> if (bDebug) { <br> wsprintf(achTempBuf, <br> "AcceptDataConn() Qlen:%d Cmd[0]:%d [1]:%d [2]:%d [3]:%d, State:%d\n", <br> nQLen, astFtpCmd[0].nFtpCmd, astFtpCmd[1].nFtpCmd, <br> astFtpCmd[2].nFtpCmd, astFtpCmd[3].nFtpCmd, nAppState); <br> OutputDebugString (achTempBuf); <br> } <br><br> hDataSock = accept (hLstnSock, (LPSOCKADDR)pstName, (LPINT)&nLen); <br> if (hDataSock == SOCKET_ERROR) { <br> int WSAErr = WSAGetLastError(); <br> if (WSAErr != WSAEWOULDBLOCK) <br> WSAperror (WSAErr, "accept", hInst); <br> } else if (bReAsync) { <br> /* This SHOULD be unnecessary, since all new sockets are supposed <br> * to inherit properties of the listening socket (like all the <br> * asynch events registered but some WinSocks don't do this. <br> * Request async notification for most events */ <br> nRet = WSAAsyncSelect(hDataSock, hWinMain, WSA_ASYNC+1, <br> (FD_READ ¦ FD_WRITE ¦ FD_CLOSE)); <br> if (nRet == SOCKET_ERROR) { <br> WSAperror(WSAGetLastError(), "WSAAsyncSelect()", hInst); <br> } <br> /* Try to get lots of buffer space */ <br> nOptval = astFtpCmd[0].nFtpCmd==STOR ? SO_SNDBUF : SO_RCVBUF; <br> GetBuf(hDataSock, INPUT_SIZE*2, nOptval); <br> } <br> return (hDataSock); <br> } /* end AcceptData() */ <br><br> /*-------------------------------------------------------------- <br> * Function: SendData() <br> * <br> * Description: Open data file, read and send <br> */ <br> long SendData(SOCKET *hDataSock, HFILE hDataFile, int len) <br> { <br> static int cbReadFromFile; /* bytes read from file */ <br> static int cbSentToServer; /* number of buffered bytes sent */ <br> static HFILE hLastFile; /* handle of last file sent */ <br> long cbTotalSent = 0; /* total bytes sent */ <br> int nRet, WSAErr, cbBytesToSend; <br><br> /* Reset our counters when we access a new file */ <br> if (hLastFile != hDataFile) { <br> cbReadFromFile = 0; <br> cbSentToServer = 0; <br> hLastFile = hDataFile; <br> } <br><br> /* Read data from file, and send it. */ <br> do { <br> if (bIOBeep) <br> MessageBeep(0xFFFF); <br><br> /* calculate what's left to send */ <br> cbBytesToSend = cbReadFromFile - cbSentToServer; <br> if (cbBytesToSend <= 0) { <br><br> /* read data from input file, if we need it */ <br> if (!bFromNul) { <br> cbReadFromFile = _lread(hDataFile, achOutBuf, INPUT_SIZE); <br> if (cbReadFromFile == HFILE_ERROR) { <br> MessageBox (hWinMain, "Error reading data file", <br> "SendData() Failed", MB_OK ¦ MB_ICONASTERISK); <br> break; <br> } else if (!cbReadFromFile){ <br> /* EOF: no more data to send */ <br> CloseFtpConn(hDataSock, (PSTR)0, 0, hWinMain); <br> EndData(); <br> break; <br> } else { <br> cbBytesToSend = cbReadFromFile; /* send as much as we read */ <br> } <br> } else { <br> /* just send whatever's in memory (up to our max) */ <br> if (lByteCount < MAXNULPUT) { <br> cbBytesToSend = INPUT_SIZE; <br> } else { <br> CloseFtpConn(hDataSock, (PSTR)0, 0, hWinMain); <br> EndData(); <br> } <br> } <br> cbSentToServer = 0; /* reset tally */ <br> } <br> /* Send data to server */ <br> nRet = send (*hDataSock, &(achOutBuf[cbSentToServer]), <br> ((len < cbBytesToSend) ? len : cbBytesToSend), 0); <br><br> if (nRet == SOCKET_ERROR) { <br> WSAErr = WSAGetLastError(); <br> /* Display significant errors */ <br> if (WSAErr != WSAEWOULDBLOCK) <br> WSAperror(WSAErr, (LPSTR)"send()", hInst); <br> } else { <br> /* Update byte counter, and display. */ <br> lByteCount += nRet; <br> _ltoa(lByteCount, achTempBuf, 10); <br> SetDlgItemText(hWinMain, IDC_DATA_RATE, achTempBuf); <br> cbSentToServer += nRet;/* tally bytes sent since last file read */ <br> cbTotalSent += nRet;/* tally total bytes sent since we started */ <br> } <br> } while (nRet != SOCKET_ERROR); <br><br> return (cbTotalSent); <br> } /* end SendData() */ <br><br> /*-------------------------------------------------------------- <br> * Function: RecvData() <br> * <br> * Description: Receive data from net and write to open data file <br> */ <br> int RecvData(SOCKET hDataSock, HFILE hDataFile, LPSTR achInBuf, int len) <br> { <br> static HFILE hLastFile; /* handle of last file sent */ <br> static int cbBytesBuffered; /* total bytes received */ <br> int cbBytesRcvd = 0; <br> int nRet=0, WSAErr; <br><br> if (hDataFile != hLastFile) { <br> hLastFile = hDataFile; <br> cbBytesBuffered = 0; <br> } <br><br> /* Read as much as we can from server */ <br> while (cbBytesBuffered < len) { <br><br> nRet = recv (hDataSock,&(achInBuf[cbBytesBuffered]), <br> len-cbBytesBuffered, 0); <br><br> if (nRet == SOCKET_ERROR) { <br> WSAErr = WSAGetLastError(); <br> /* Display significant errors */ <br> if (WSAErr != WSAEWOULDBLOCK) <br> WSAperror(WSAErr, (LPSTR)"recv()", hInst); <br> /* exit recv() loop on any error */ <br> goto recv_end; <br> } else if (nRet == 0) { /* Other side closed socket */ <br> /* quit if server closed connection */ <br> goto recv_end; <br><br> } else { <br> /* Update byte counter, and display */ <br> lByteCount += nRet; <br> _ltoa(lByteCount, achTempBuf, 10); <br> SetDlgItemText(hWinMain, IDC_DATA_RATE, achTempBuf); <br> cbBytesRcvd += nRet; /* tally bytes read */ <br> cbBytesBuffered += nRet; <br> } <br> } <br> recv_end: <br> if (!bToNul && <br> ((cbBytesBuffered > (len-MTU_SIZE)) ¦¦ <br> ((nRet == SOCKET_ERROR) && WSAGetLastError() != WSAEWOULDBLOCK) ¦¦<br><br> (nRet == 0))) { <br> /* If we have a lot buffered, write to data file */ <br> nRet = _lwrite(hDataFile, achInBuf, cbBytesBuffered); <br> if (nRet == HFILE_ERROR) <br> MessageBox (hWinMain, "Can't write to local file", <br> "RecvData() Failed", MB_OK ¦ MB_ICONASTERISK); <br> cbBytesBuffered = 0; <br> } else if (bToNul) <br> cbBytesBuffered = 0; <br> return (cbBytesRcvd); <br> } /* end RecvData() */ <br><br> /*-------------------------------------------------------------- <br> * Function: EndData() <br> * <br> * Description: Close up the data connection <br> */ <br> void EndData (void) { <br> LONG dByteRate; <br> LONG lMSecs; <br><br> /* Calculate data transfer rate, and display */ <br> lMSecs = (LONG) GetTickCount() - lStartTime; <br> if (lMSecs <= 55) <br> lMSecs = 27; /* about half of 55Msec PC clock resolution */ <br><br> /* Socket Check should not be necessary, but some WinSocks <br> * mistakenly post FD_CLOSE to listen socket after close */ <br> nAppState &= ~(DATACONNECTED); <br> SetDlgItemText (hWinMain, IDC_STATUS, "Status: connected"

; <br><br> if (lByteCount > 0L) { <br> dByteRate = (lByteCount/lMSecs); /* data rate (bytes/Msec) */ <br> wsprintf (achTempBuf,"%ld bytes %s in %ld.%ld seconds (%ld.%ld Kbytes/sec)",<br><br> lByteCount, <br> ((astFtpCmd[0].nFtpCmd==STOR) ? "sent":"received"

, <br> lMSecs/1000, lMSecs%1000, <br> (dByteRate*1000)/1024, (dByteRate*1000)%1024); <br> SetDlgItemText (hWinMain, IDC_DATA_RATE, achTempBuf); <br> if (hLogFile != HFILE_ERROR) <br> _lwrite (hLogFile, achTempBuf, strlen(achTempBuf)); <br> } <br> lStartTime = 0L; <br> if (hDataFile != HFILE_ERROR) { <br> _lclose (hDataFile); <br> hDataFile = HFILE_ERROR; <br> if (astFtpCmd[0].nFtpCmd == LIST) { <br> wsprintf (achTempBuf, "notepad %s", szTempFile); <br> WinExec (achTempBuf, SW_SHOW); <br> } <br> } <br> astFtpCmd[0].nFtpCmd = 0; /* reset pending command */ <br> } /* end EndData() */ <p>Siddhartha Singh<br><a href=mailto:siddhu_singh@hotmail.com>siddhu_singh@hotmail.com</a><br><a href=siddhu.freehosting.net> </a><br>