I’ve been trying to use FTPClientExample.java to FTPS(FTP over SSL) to an IBM mainframe. (From the 3.0.1 source.) It seems to work except the ‘ftp.disconnect()’ hangs and the thread never terminates. Here is the console output:
220-FTPSERV2 IBM FTP CS V1R11 at serverNameHere, 16:48:22 on 2011-07-27. 220-Welcome to the xyz FTP Server 220 Connection will close if idle for more than 5 minutes. AUTH TLS 234 Security environment established - ready for negotiation PBSZ 0 200 Protection buffer size accepted PROT P 200 Data connection protection set to private Connected serverAddressHere on serverPortHere USER ******* 331 Send password please. PASS ******* 230-****************************************************************** 230-* Welcome JohnDoh to the XYZ system. 230-* It is Wed Jul 27 16:48:24 2011. 230-* Unauthorized use is prohibited. Usage may be subject to 230-* security testing and monitoring. Misuse is subject to criminal 230-* prosecution. There is no expectation of privacy except as 230-* provided by law. 230-****************************************************************** 230 JOHNDOH is logged on. Working directory is "JOHNDOH.". SYST 215 MVS is the operating system of this server. FTP Server is running on z/OS. PASV 227 Entering Passive Mode (xxx,xxx,xxx,xxx,x,xxx) STOR 'SOMEFILE.NEW.EXAMPLE.TXT' 125 Storing data set SOMEFILE.NEW.EXAMPLE.TXT 250 Transfer completed successfully. NOOP 200 OK QUIT 221 Quit command received. Goodbye. Note that the last reply from the server indicates a successful QUIT command. However, the program never terminates. Here's the debug information from the SSL socket which shows the QUIT and then the attempted 'close_notify'. (For those that follow, I added -Djavax.net.debug=all to the virtual machine arguments to get the debug info.) MAC: update Padded plaintext before ENCRYPTION: len = 26 0000: 51 55 49 54 0d 0a 08 01 8d 8a c7 0a 02 d8 95 e9 QUIT............ 0010: 6f ff c5 c2 ce ae 93 91 dd 5e o......... main, WRITE: SSLv3 Application Data, length = 26 [Raw write]: length = 31 0000: 17 03 00 00 1a b3 6e 70 da b4 d0 b9 a2 49 58 2d ......np.....IX. 0010: 5a dd b5 3f 9d ea d1 66 ce 46 53 33 f8 a2 2a Z......f.FS3... QUIT [Raw read]: length = 5 0000: 17 03 00 00 39 ....9 [Raw read]: length = 57 0000: 43 aa e1 a9 9e 49 38 38 38 b0 fd 14 4c e0 eb d1 C....I888...L... 0010: 9c 5e 5b 83 9f c5 c8 30 ba 9e 91 54 14 ab da a8 .......0...T.... 0020: f3 81 3d a2 46 22 a0 5c a7 30 30 32 66 3a 2a ee ....F....002f... 0030: 15 03 e2 30 35 89 78 ec 30 ...05.x.0 main, READ: SSLv3 Application Data, length = 57 Padded plaintext after DECRYPTION: len = 57 0000: 32 32 31 20 51 75 69 74 20 63 6f 6d 6d 61 6e 64 221.Quit.command 0010: 20 72 65 63 65 69 76 65 64 2e 20 47 6f 6f 64 62 .received..Goodb 0020: 79 65 2e 0d 0a 86 f4 3c 7d ca b9 de f4 e6 e3 20 ye.............. 0030: 35 cf 2e 2a b3 c4 70 ae 71 5.....p.q MAC: update 221 Quit command received. Goodbye. 3.0.1, b4 closing socket 6f0f6f0f[SSL_RSA_WITH_RC4_128_SHA: Socket[addr=hostnamehere/ipaddresshere port=xxxx,localport=xxxx]] main, called close() main, called closeInternal(true) main, SEND SSLv3 ALERT: warning, description = close_notify MAC: update Padded plaintext before ENCRYPTION: len = 22 0000: 01 00 1d 3a 7f 09 44 9c b7 9f 5c 2b 6c 71 d6 a1 ......D.....lq.. 0010: 86 fc a3 f8 6a 51 ....jQ main, WRITE: SSLv3 Alert, length = 22 [Raw write]: length = 27 0000: 15 03 00 00 16 e6 ad b4 00 9a c4 fc cd 30 b4 4d .............0.M 0010: a9 7a 82 2b a8 8a 4c 70 c4 f7 41 .z....Lp..A main, waiting for close_notify or alert: state 5 <<<<<<<<<<< THE SSL SOCKET IS WAITING FOR A REPLY FROM THE SERVER... Notice that the SSL socket in my program is waiting for a 'close_notify' response from the FTP server. It waits forever. I think this is because the QUIT command closes the connection on the server. So I commented out the 'logout(QUIT)' and ran the program again: NO LOGOUT/QUIT HERE, IT'S COMMENTED OUT 3.0.1, b4 closing socket 71037103[SSL_RSA_WITH_RC4_128_SHA: Socket[addr=addressGoesHere,port=portHere,localport=portHere]] main, called close() main, called closeInternal(true) main, SEND SSLv3 ALERT: warning, description = close_notify MAC: update Padded plaintext before ENCRYPTION: len = 22 0000: 01 00 5b 7e 2e ac b5 87 21 0a 2b a6 6d cd 6b f1 ............m.k. 0010: b4 61 ad 5c 51 85 .a..Q. main, WRITE: SSLv3 Alert, length = 22 [Raw write]: length = 27 0000: 15 03 00 00 16 76 e3 2b a6 dd a9 b2 30 b2 c6 ea .....v......0... 0010: a9 cb e8 75 6c 22 ed 46 e4 0e 13 ...ul..F... main, waiting for close_notify or alert: state 5 <<<<<<<<<<<<<< HERE'S WHERE THE HANG OCCURRED IN THE PREVIOUS RUN [Raw read]: length = 5 0000: 15 03 00 00 16 ..... [Raw read]: length = 22 0000: e1 22 37 3a 99 bd 2f 2f 53 b1 a5 be a3 c5 7e bc ..7.....S....... 0010: 73 69 4b a9 a4 4b siK..K main, READ: SSLv3 Alert, length = 22 Padded plaintext after DECRYPTION: len = 22 0000: 01 00 18 ca 28 9c fc c1 83 ba 20 3b a6 f8 30 36 ..............06 0010: fa 45 7e bc 4e d6 .E..N. MAC: update main, RECV SSLv3 ALERT: warning, close_notify <<<<<<<<<<<<<<<<<< HERE'S WHERE THE FTP SERVER SENT A close_notify RESPONSE main, called closeInternal(false) main, close invoked again; state = 5 3.0.1, after closing socket 3.0.1, b4 closing closeable java.net.SocketInputStream@60636063 3.0.1, after closing closeable 3.0.1, b4 closing closeable java.net.SocketOutputStream@608f608f 3.0.1, after closing closeable ******** 3.0.1 exiting, error = 'false' As you can see, commenting out the 'logout/QUIT' statement allowed the program to terminate normally. So should I simply disconnect from the server or should I QUIT and then disconnect? http://www.faqs.org/rfcs/rfc959.html LOGOUT (QUIT) This command terminates a USER and if file transfer is not in progress, the server closes the control connection. If file transfer is in progress, the connection will remain open for result response and the server will then close it. If the user-process is transferring files for several USERs but does not wish to close and then reopen connections for each, then the REIN command should be used instead of QUIT. >>> Does this mean that QUIT closes the connection on the server? (It looks like it should.) An unexpected close on the control connection will cause the server to take the effective action of an abort (ABOR) and a logout (QUIT). >>> Does this mean that disconnecting without QUIT will force the FTP session to logout automatically? Thanks for the help!
