1
- import socket import time class netbios_query : def __init__ (self ,name ,ip_address_list ): self .name = name self .ip_address_list = ip_address_list self .__populate () def __populate (self ): self .boardcast_address_list = [] for ip_address in self .ip_address_list : split_items = ip_address .split ('.' ) split_items [3 ] = '255' boardcast_address = '.' .join (split_items ) self .boardcast_address_list .append (boardcast_address ) self .port = 137 self .nqs = socket .socket (socket .AF_INET , socket .SOCK_DGRAM ) self .nqs .setblocking (False ) self .query_data = [ b"\xa9 \xfb " , # Transaction ID b"\x01\x10", # Flags Query b"\x00\x01", # Question:1 b"\x00\x00", # Answer RRS b"\x00\x00", # Authority RRS b"\x00\x00", # Additional RRS b"\x20", # length of Name:32 b"NAME", # Name b"\x00", # NameNull b"\x00\x20", # Query Type:NB b"\x00\x01"] # Class self.query_data[7] = str.encode(self.__netbios_encode(self.name)) def __netbios_encode(self,src): src = src.ljust(15,"\x20") src = src.ljust(16,"\x00") names = [] for c in src: char_ord = ord(c) high_4_bits = char_ord >> 4 low_4_bits = char_ord & 0x0f names.append(high_4_bits) names.append(low_4_bits) res = "" for name in names: res += chr(0x41+name) return res def query(self): wait_count = 10 send_data = [] ret = None for bytes_ele in self.query_data: for list_ele in bytes_ele: send_data.append(list_ele) while wait_count: for boardcast_address in boardcast_address_list: try: self.nqs.sendto(bytes(send_data), (self.boardcast_address, self.port)) data_rev, ADDR = self.nqs.recvfrom(1024) except: time.sleep(1) continue if(len(data_rev) > 0): ret = boardcast_address break if ret: break else: wait_count -= 1 self.nqs.close() return ret
1
+ import socket
2
+ import time
3
+
4
+
5
+ class netbios_query :
6
+ def __init__ (self , name , ip_address_list ):
7
+ self .__name = name
8
+ self .__ip_address_list = ip_address_list
9
+ self .__boardcast_address_list = []
10
+
11
+ self .__populate ()
12
+
13
+ def __populate (self ):
14
+ for ip_address in self .__ip_address_list :
15
+ split_items = ip_address .split ('.' )
16
+ split_items [3 ] = '255'
17
+ boardcast_address = '.' .join (split_items )
18
+ self .__boardcast_address_list .append (boardcast_address )
19
+
20
+ self .__port = 137
21
+ self .__nqs = socket .socket (socket .AF_INET , socket .SOCK_DGRAM )
22
+ self .__nqs .setblocking (False )
23
+ self .__query_data = [
24
+ b"\xa9 \xfb " , # Transaction ID
25
+ b"\x01 \x10 " , # Flags Query
26
+ b"\x00 \x01 " , # Question:1
27
+ b"\x00 \x00 " , # Answer RRS
28
+ b"\x00 \x00 " , # Authority RRS
29
+ b"\x00 \x00 " , # Additional RRS
30
+ b"\x20 " , # length of Name:32
31
+ b"NAME" , # Name
32
+ b"\x00 " , # NameNull
33
+ b"\x00 \x20 " , # Query Type:NB
34
+ b"\x00 \x01 " ] # Class
35
+ self .__query_data [7 ] = str .encode (self .__netbios_encode (self .__name ))
36
+
37
+ def __netbios_encode (self , src ):
38
+ src = src .ljust (15 , "\x20 " )
39
+ src = src .ljust (16 , "\x00 " )
40
+ names = []
41
+ for c in src :
42
+ char_ord = ord (c )
43
+ high_4_bits = char_ord >> 4
44
+ low_4_bits = char_ord & 0x0f
45
+ names .append (high_4_bits )
46
+ names .append (low_4_bits )
47
+ res = ""
48
+ for name in names :
49
+ res += chr (0x41 + name )
50
+ return res
51
+
52
+ def query (self ):
53
+ wait_count = 10
54
+ send_data = []
55
+ ret = None
56
+
57
+ for bytes_ele in self .__query_data :
58
+ for list_ele in bytes_ele :
59
+ send_data .append (list_ele )
60
+
61
+ while wait_count :
62
+ for idx , boardcast_address in enumerate (self .__boardcast_address_list ):
63
+ try :
64
+ self .__nqs .sendto (bytes (send_data ),
65
+ (boardcast_address , self .__port ))
66
+ time .sleep (1 )
67
+ data_rev , ADDR = self .__nqs .recvfrom (1024 )
68
+ except Exception as ex :
69
+ continue
70
+
71
+ if len (data_rev ) > 0 :
72
+ ret = self .__ip_address_list [idx ]
73
+ break
74
+
75
+ if ret :
76
+ break
77
+ else :
78
+ wait_count -= 1
79
+
80
+ self .__nqs .close ()
81
+
82
+ return ret
0 commit comments