[jcifs] JCIFS Over the internet..
Patrick Cerri
robogiant at hotmail.com
Mon Oct 2 10:12:35 GMT 2006
Hi Mike & all concerned,
Have been using the most excellent JCIFS to create a java webstart file explorer for our company, that connects to an online Samba drive. Wanted to mention a few things I have found on my journey.
I am using the library on my Win XP SP2 / Fedora Core 5 desktop over the internet, connecting to a Linux Box Fedora 3, with 2.6 kernel. Samba inbuilt. I am compiling using the latest 1.5_07 jdk with netbeans. I have searched the mailing archives for answers to my questions, and I may just be using the library wrong. Hope not..
1) In SmbTransport.java, line 285..
tconHostName = address.getHostName();
This can sometimes take up to 6 seconds to return!! I connect using an IP, not a domain name. Since speed is important in my app, I have changed it to
tconHostName = address.getHostAddress();
seems to work now...
2) In SMBTransport.java line 230.. when creating a socket which binds to a local port
socket = new Socket( thost, port, localAddr, localPort );
I have found that on some machines a Valid Local IP address is not found and only 127.0.0.1 is available. Socket creation then fails as you can't bind to 127.0.0.1.
I have tried to fix this by setting the jcifs property 'jcifs.smb.client.laddr' using the following code..
boolean cont = true;
for(Enumeration e = NetworkInterface.getNetworkInterfaces();e.hasMoreElements() && cont;){
NetworkInterface inter = (NetworkInterface)e.nextElement();
for(Enumeration ne = inter.getInetAddresses();ne.hasMoreElements() && cont;){
InetAddress add = (InetAddress)ne.nextElement();
String name = add.getHostName();
String addr = add.getHostAddress();
//SORRY - this should be some regular expression check, but just hacked it out..
int index = addr.indexOf(".");
if(index!=-1){
index = addr.indexOf(".", index);
if(index!=-1){
index = addr.indexOf(".", index);
if(index!=-1){
//Check it..
if(!addr.equals("127.0.0.1")){
cont = false;
System.out.println("LocalHost found "+name+" "+addr);
//Now set the JCIFS property
System.setProperty("jcifs.smb.client.laddr",addr);
}
}
}
}
}
}
This has worked 99%of the time, but on machines that have a pocket PC connected via Active Sync I have noticed that 2 valid IP addresses can be found and only one of them works... Also if you have twin network cards on a single box..
Now I have changed it to :-
socket = new Socket( thost, port); No Binding at all, and it works fine. Can you explain what the benefit of the binding is ?
3) This one's a little strange and I wish I knew why it works or not... just does..
I was getting a crash (SMB_COM_AND_WRITEX or something..) whenever uploading large files ( 100MB or more ) to my server, after about 20 minutes. I traced the code in debug mode and found out about the /* Dodge NetBIOS keep-alive */ code that you have implemented.
What I found though was that after a certain amount of time, about 20 miutes,
SmbTransport.java line 329
.}while(sbuf[0] == 0x85) was failing EVEN THOUGH sbuf[0] had a value of what seemed like 0x85 !!
I changed it to
}while(((int)sbuf[0]) == -123); Which I AGREE should be EXACTLY THE SAME, but now I no longer get the crash bug. Any Ideas ?
4) I have a 10Mbps connection at home, and the most I have managed to download using the SmbRandomAccessFile is 1Mbps.
At work I have a 24Mbps connection and the most I have managed to get off the server is 320KBps (~3 MBps). Over Apache/HTTP I have got much higher speeds. I looked in the archive and you mention something about Windows not sending the ACK signal fast enough for the MTU or something..? Is that still an issue ? Can something be done about it. Have I just set it up wrong ?
Thanx for listening, hope this stuff isn't a waste of everyone's time..
paddy.
ps keep up the excellent work..
-------------- next part --------------
HTML attachment scrubbed and removed
More information about the jcifs
mailing list