commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rory Winston (JIRA)" <j...@apache.org>
Subject [jira] Closed: (NET-192) Solaris 10 unable to download files, FTPClient timesout with: "426 Data connection: Error 0"
Date Mon, 01 Dec 2008 12:43:44 GMT

     [ https://issues.apache.org/jira/browse/NET-192?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Rory Winston closed NET-192.
----------------------------

    Resolution: Cannot Reproduce

Need something reproducible here - the only differential is the Solaris version, which leads
me to think that this may be a server rather than a client issue.

> Solaris 10 unable to download files, FTPClient timesout with: "426 Data connection: Error
0"
> --------------------------------------------------------------------------------------------
>
>                 Key: NET-192
>                 URL: https://issues.apache.org/jira/browse/NET-192
>             Project: Commons Net
>          Issue Type: Bug
>    Affects Versions: 1.4
>         Environment: commons-net-1.4.1, Java 1.5.0_u10
> Windows XP client, Solaris 10 server
>            Reporter: Zac Heismann
>         Attachments: FTPTest.zip
>
>
> Existing code working on Solaris 8, breaks under Solaris 10.  
> We configured the ftpdaemon's flush-wait property to be set to no.  Here's some info
on what we did:
> http://forums.ni.com/ni/board/message?board.id=180&message.id=30183
> From the man page:
>   flush-wait yes|no [typelist]
>          Controls the behavior at the end of a download or direc-
>          tory  listing.  If yes, shutdown the data connection for
>          sending and wait for the client to close its end  before
>          sending a transfer complete reply on the control connec-
>          tion. This is the default behavior.  If  no,  close  the
>          data  connection  and  send  the transfer complete reply
>          without waiting for the client. With this behavior, data
>          loss can go undetected.
>          If a client hangs at the end of a directory listing,  or
>          the system has many sockets in the FIN_WAIT_2 state, try
>          setting  to  no  as  a  workaround  for  broken   client
>          behavior.
> -----------
> I'll attempt to attach a test case (you'll need to configure some properties though).
> Here's the code being executed.  The execution hangs when the FTPClient.completePendingCommand()
method is called for around 20 minutes and then the following Reply String is returned from
the FTPClient: "426 Data connection: Error 0."
> import java.io.BufferedInputStream;
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.InputStream;
> import org.apache.commons.net.ftp.FTP;
> import org.apache.commons.net.ftp.FTPClient;
> import org.apache.commons.net.ftp.FTPReply;
> /**
>  * Solaris 10 unable to download files, FTPClient timesout with: "426 Data connection:
Error 0"
>  * 
>  * commons-net-1.4.1, Java 1.5.0_u10
>  * Windows XP client, Solaris 10 server
>  * 
> Existing code working on Solaris 8, breaks under Solaris 10.  
> We configured the ftpdaemon's flush-wait property to be set to no.  Here's some info
on what we did:
> http://forums.ni.com/ni/board/message?board.id=180&message.id=30183
> From the man page:
>   flush-wait yes|no [typelist]
>          Controls the behavior at the end of a download or direc-
>          tory  listing.  If yes, shutdown the data connection for
>          sending and wait for the client to close its end  before
>          sending a transfer complete reply on the control connec-
>          tion. This is the default behavior.  If  no,  close  the
>          data  connection  and  send  the transfer complete reply
>          without waiting for the client. With this behavior, data
>          loss can go undetected.
>          If a client hangs at the end of a directory listing,  or
>          the system has many sockets in the FIN_WAIT_2 state, try
>          setting  to  no  as  a  workaround  for  broken   client
>          behavior.
>  * 
>  * @author zheismann
>  */
> public final class App 
> {
>     
>     public static void testFTP(String ftpHost, String ftpUserName, String ftpPassword,

>                                String fileToDownload, String localDestinationFile)
>         throws Exception
>     {
>         File localFile = new File( localDestinationFile );
>         FTPClient ftpClient = setupConnection(ftpHost, ftpUserName, ftpPassword);
>         ftpClient.setFileType( FTP.BINARY_FILE_TYPE );
>         System.out.println("Attempting to download '" + fileToDownload + "' from host:
" + ftpHost);
>         System.out.println("to the localhost: '" + localFile.getAbsolutePath() + "'");
>         FileOutputStream outStream = new FileOutputStream( localFile );
>         InputStream ftpIn = ftpClient.retrieveFileStream( fileToDownload );
>         InputStream tempStream = new BufferedInputStream( ftpIn );
>         byte[] buf = new byte[ftpClient.getBufferSize()];
>         int len;
>         //Read from the ftpStream and write to the local file
>         while ( (len = tempStream.read( buf )) >= 0 )
>         {
>             outStream.write( buf, 0, len );
>         }
>         if ( !ftpClient.completePendingCommand() )
>         {
>             throw new Exception(
>                 "Error downloading file: " +
>                 localDestinationFile + "\n" +
>                 ftpClient.getReplyString() + "\n" );
>         }
>         System.out.println("Success!");
>     }
>     
>     private static FTPClient setupConnection(String ftpHost, String ftpUserName, String
ftpPassword) throws Exception
>     {
>         FTPClient ftpClient = new FTPClient();
>         ftpClient.connect(ftpHost);
>         ftpClient.login(ftpUserName, ftpPassword);
>         int reply = ftpClient.getReplyCode();
>         if (!FTPReply.isPositiveCompletion(reply))
>         {
>             throw new Exception( "Error connecting to: " + ftpHost + "\n" + ftpClient.getReplyString()
+ "\n" );
>         }
>         return ftpClient;
>     }
> public class App 
> {
>     private static final String FTP_HOST = "";
>     private static final String FTP_USERNAME = "zheisman";
>     private static final String FTP_PASSWORD = "";
>     private static final String FILE_TO_DOWNLOAD = "/home/zheisman/pom.xml";
>     private static final String FTP_FILE_DESTINATION = "/pom.xml";
>     
>     private static void testFTP() throws Exception
>     {
>         File localFile = new File( FTP_FILE_DESTINATION );
>         FTPClient ftpClient = setupConnection();
>         ftpClient.setFileType( FTP.BINARY_FILE_TYPE );
>         System.out.println("Attempting to download '" + FILE_TO_DOWNLOAD + "' from host:
" + FTP_HOST);
>         System.out.println("to the localhost: '" + localFile.getAbsolutePath() + "'");
>         FileOutputStream outStream = new FileOutputStream( localFile );
>         InputStream ftpIn = ftpClient.retrieveFileStream( FILE_TO_DOWNLOAD );
>         InputStream tempStream = new BufferedInputStream( ftpIn );
>         byte[] buf = new byte[ftpClient.getBufferSize()];
>         int len;
>         //Read from the ftpStream and write to the local file
>         while ( (len = tempStream.read( buf )) >= 0 )
>         {
>             outStream.write( buf, 0, len );
>         }
>         if ( !ftpClient.completePendingCommand() )
>         {
>             throw new Exception(
>                 "Error downloading file: " +
>                 FILE_TO_DOWNLOAD + "\n" +
>                 ftpClient.getReplyString() + "\n" );
>         }
>     }
>     
>     private static FTPClient setupConnection() throws Exception
>     {
>         FTPClient ftpClient = new FTPClient();
>         ftpClient.connect(FTP_HOST);
>         ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
>         int reply = ftpClient.getReplyCode();
>         if (!FTPReply.isPositiveCompletion(reply))
>         {
>             throw new Exception( "Error connecting to: " + FTP_HOST + "\n" + ftpClient.getReplyString()
+ "\n" );
>         }
>         return ftpClient;
>     }
>     
>     public static void main( String[] args )
>     {
>         try
>         {
>             testFTP();
>         }
>         catch (Exception ex)
>         {
>             ex.printStackTrace();
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message