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
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.