NMB.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package de.tudarmstadt.informatik.hostage.protocol.smbutils;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. import java.net.SocketTimeoutException;
  7. import java.net.UnknownHostException;
  8. import de.tudarmstadt.informatik.hostage.net.MyDatagramSocketFactory;
  9. public class NMB extends Thread {
  10. private DatagramSocket nbnsSocket;
  11. private DatagramSocket nbdsSocket;
  12. private DatagramPacket packet;
  13. private String ip;
  14. private String[] ipParts;
  15. private InetAddress dst;
  16. private int nbnsPort = 137;
  17. private int nbdsPort = 138;
  18. private String username;
  19. private String workgroup;
  20. private NBNS nbns;
  21. private NBDS nbds;
  22. private volatile boolean smbRunning;
  23. private Receiver receiver;
  24. public NMB(String ip, String username, String workgroup) {
  25. try {
  26. smbRunning = true;
  27. this.username = username;
  28. this.workgroup = workgroup;
  29. this.ip = ip;
  30. ipParts = ip.split("\\.");
  31. String newHostAddr = ipParts[0] + "." + ipParts[1] + "." + ipParts[2] + ".255";
  32. dst = InetAddress.getByName(newHostAddr);
  33. } catch (UnknownHostException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. private void sendPacket(NBNS nbns) {
  38. try {
  39. byte[] packetBytes = nbns.getNextPacket();
  40. packet = new DatagramPacket(packetBytes, packetBytes.length, dst, nbnsPort);
  41. nbnsSocket.send(packet);
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. private void sendPacket(NBDS nbds) {
  47. try {
  48. byte[] packetBytes = nbds.getBytes();
  49. packet = new DatagramPacket(packetBytes, packetBytes.length, dst, nbdsPort);
  50. nbdsSocket.send(packet);
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. private void registrate() {
  56. registrateUser();
  57. registrateGroup();
  58. }
  59. private void registrateUser() {
  60. nbns = new NBNS(new byte[]{0x50, 0x00}, NBNSType.REGISTRATION_UNIQUE, NBNSService.SERVER, username, ip);
  61. sendPacket(nbns);
  62. nbns.setService(NBNSService.MESSENGER);
  63. sendPacket(nbns);
  64. nbns.setService(NBNSService.WORKSTATION);
  65. sendPacket(nbns);
  66. }
  67. private void registrateGroup() {
  68. nbns.setName(workgroup);
  69. nbns.setType(NBNSType.REGISTRATION_GROUP);
  70. sendPacket(nbns);
  71. nbns.setService(NBNSService.BROWSER_ELECTION);
  72. sendPacket(nbns);
  73. }
  74. private void browserElection() {
  75. nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.BROWSER);
  76. sendPacket(nbds);
  77. }
  78. private void registrateMsBrowse() {
  79. nbns.setName("__MSBROWSE__");
  80. nbns.setType(NBNSType.REGISTRATION_MSBROWSE);
  81. nbns.setService(NBNSService.BROWSER);
  82. sendPacket(nbns);
  83. }
  84. private void registrateLocalMaster() {
  85. nbns.setName(workgroup);
  86. nbns.setType(NBNSType.REGISTRATION_UNIQUE);
  87. nbns.setService(NBNSService.LOCAL_MASTER_BROWSER);
  88. sendPacket(nbns);
  89. }
  90. private void announceHost() {
  91. nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.HOST_ANNOUNCEMENT_WITH_SERVICES);
  92. sendPacket(nbds);
  93. }
  94. private void queryName() {
  95. nbns.setType(NBNSType.NAME_QUERY);
  96. nbns.setService(NBNSService.LOCAL_MASTER_BROWSER);
  97. sendPacket(nbns);
  98. }
  99. private void requestAnnouncement() {
  100. nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.REQUEST_ANNOUNCEMENT);
  101. sendPacket(nbds);
  102. }
  103. private void localMasterAnnouncementAll() {
  104. nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.LOCAL_MASTER_ANNOUNCEMENT_ALL);
  105. sendPacket(nbds);
  106. }
  107. private void domainAnnouncement() {
  108. nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.DOMAIN_ANNOUNCEMENT);
  109. sendPacket(nbds);
  110. }
  111. private void localMasterAnnouncement() {
  112. nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.LOCAL_MASTER_ANNOUNCEMENT);
  113. sendPacket(nbds);
  114. }
  115. @Override
  116. public void run() {
  117. try {
  118. nbnsSocket = new MyDatagramSocketFactory().createDatagramSocket(nbnsPort);
  119. nbnsSocket.connect(dst, nbnsPort);
  120. nbdsSocket = new MyDatagramSocketFactory().createDatagramSocket(nbdsPort);
  121. nbdsSocket.connect(dst, nbdsPort);
  122. } catch (IOException e) {
  123. e.printStackTrace();
  124. }
  125. registrate();
  126. receiver = new Receiver();
  127. receiver.start();
  128. announceHost();
  129. queryName();
  130. registrate();
  131. queryName();
  132. registrate();
  133. queryName();
  134. registrate();
  135. queryName();
  136. browserElection();
  137. browserElection();
  138. browserElection();
  139. browserElection();
  140. registrateMsBrowse();
  141. registrateMsBrowse();
  142. registrateMsBrowse();
  143. registrateMsBrowse();
  144. registrateLocalMaster();
  145. registrateLocalMaster();
  146. registrateLocalMaster();
  147. registrateLocalMaster();
  148. requestAnnouncement();
  149. localMasterAnnouncementAll();
  150. domainAnnouncement();
  151. // // domain/workgroup announcement
  152. // // local master announcmen
  153. announceHost();
  154. nbnsSocket.close();
  155. nbdsSocket.close();
  156. }
  157. public synchronized void setSmbRunning(boolean smbRunning) {
  158. this.smbRunning = smbRunning;
  159. }
  160. private class Receiver extends Thread {
  161. private DatagramPacket packet;
  162. private byte[] buffer;
  163. private boolean masterAnswered = false;
  164. public Receiver() {
  165. buffer = new byte[2048];
  166. packet = new DatagramPacket(buffer, buffer.length);
  167. }
  168. @Override
  169. public void run() {
  170. try {
  171. nbnsSocket.setSoTimeout(1000);
  172. try {
  173. while (!masterAnswered) {
  174. nbnsSocket.receive(packet);
  175. if (!(packet.getAddress().toString().equals("/"+ip))) {
  176. masterAnswered = true;
  177. setSmbRunning(false);
  178. }
  179. }
  180. } catch (SocketTimeoutException e) {
  181. setSmbRunning(false);
  182. e.printStackTrace();
  183. }
  184. } catch (IOException e) {
  185. e.printStackTrace();
  186. }
  187. }
  188. }
  189. }