『壹』 python發送數據包獲取返回數據(其他的語言能實現也可以)
使用網路翻譯的一個例子,可以翻譯你輸入的文字,發送需要的內容,獲取返回的數據
import urllib.request
import urllib.parse
import json
import time
while True:
url = 'http://fanyi..com/v2transapi'
words = input("輸入你想翻譯的內容:")
data = {}
data['from'] = 'auto'
data['to'] = 'auto'
data['query'] = words
data['transtype'] = 'translang'
data['simple_means_flag'] = '3'
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'
}
req = urllib.request.Request(url, data, headers)
req.add_header('Referer', 'http://fanyi..com/')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
js = json.loads(html)
# print(html)
# print(js)
print(js['trans_result']['data'][0]['dst'])
time.sleep(1)
『貳』 python中MAC地址打包問題
# -*- coding=utf8 -*-
import socket
import struct
def WOL(macaddress):
if len(macaddress) == 12:
pass
elif len(macaddress) == 12 + 5:
sep = macaddress[2]
macaddress = macaddress.replace(sep, '')
else:
raise ValueError('Incorrect MAC address format')
data = ''.join(['FFFFFFFFFFFF', macaddress * 16])
send_data = b''
for i in range(0, len(data), 2):
byte_dat = struct.pack('B', int(data[i: i + 2], 16))
send_data = send_data + byte_dat
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(send_data, ('255.255.255.255', 7))
sock.close()
if __name__ == '__main__':
WOL('6C626D4EF0B2')
『叄』 怎樣發送廣播信息
運行下面敲cmd 然後敲如下命令 注意 to的後面需要添加你要發送的主機地址或者唯一的機器名稱
send message to
『肆』 求助發廣播包的解決方法
可能中了蠕蟲病毒,換金山殺毒試試。
『伍』 python socket向客戶端廣播問題
import socket,traceback
host = '2.2.3.5'
port = 85
txt = input("請輸入廣播內容:")
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.bind((host,port))
print "Listen on the port 85......"
while True:
try:
sock,addr = s.recvfrom(8192)
print "Receive data from:",addr
s.sendto(txt,addr)#這里就是填寫發送內容的
except (KeyboardInterrupt,SystemExit):
raise
except:
traceback.print_exc()
#未對以上代碼的正確性進行驗證。
『陸』 Python網路編程5-實現DHCP Client
DHCP(Dynamic Host Configuration Protocol,動態主機配置協議),前身是BOOTP協議,是一個區域網的網路協議,使用UDP協議工作,統一使用兩個IANA分配的埠:67(伺服器端),68(客戶端)。主要作用是集中的管理、分配IP地址,使client動態的獲得IP地址、Gateway地址、DNS伺服器地址等信息。
option欄位
DHCP報文中的Options欄位可以用來存放普通協議中沒有定義的控制信息和參數。如果用戶在DHCP伺服器端配置了Options欄位,DHCP客戶端在申請IP地址的時候,會通過伺服器端回應的DHCP報文獲得Options欄位中的配置信息。
獲取IP地址過程
實驗使用的linux 主機由兩個網路介面,其中ens33使用DHCP獲取IP地址,ens37使用靜態IP地址;因此需要使用ens33來發送數據包。
Change_MAC.py用於MAC地址與Bytes類型相互轉換。
DHCP_Discover.py用於發送DHCP Discover報文;其中GET_MAC.py見ARP章節。
DHCP_Request.py用於發送DHCP Request報文。
DHCP_FULL.py用於完成DHCP Client與DHCP Server的報文交互
Wireshark對遠程linux主機抓包,結果如下
客戶端以廣播發送DHCP Discover包,其中報文操作類型為1(請求報文),DHCP客戶端的MAC地址設置為00:0c:29:03:a1:08,option53設置報文類型為Discover,option55(請求選項列表)中包含請求的參數。
伺服器以單播向客戶端回復信息,其中報文操作類型為2(應答報文),分配給客戶端的IP為192.168.160.146,option 53設置報文類型為offer,Option 54設置伺服器標識為192.168.160.254,其他option為客戶端請求列表的應答。
值得注意的是,交互的四個報文中Transaction ID均為0x00000000,表明是同一次DHCP交互報文。
『柒』 Socket 通信之 UDP 通信
前段時間,我們在 這篇文章 中談到了多進程和進程之間的通信方式,主要談到了本地進程之間使用隊列(Queue)進程通信,如果我們要通信的進程不在同一台主機上,我們就無法使用隊列進行通信了,這時就需要使用 Socket(套接字)。
Socket 是應用層和傳輸層之間的一層抽象協議,可以用來進行進程間通信,一般有 UDP 和 TCP 兩種通信方式,前者速度稍快,穩定性不好,無法丟包重傳。後者速度稍慢一點,但穩定性很好,可以丟包重傳。
本文首先介紹使用 Socket 進行 UDP 通信。
使用 Socket 進行 UDP 通信的流程如下:
下面依次進行講解。
要進行 Socket 通信,我們需要使用 socket 模塊,首先需要創建一個 Socket 對象。下面是兩種創建方式:
如果我們需要向別的主機發送數據,我們需要改主機的 IP 地址和相應的埠號。在使用 Socket 進行通信時,需要將兩個信息寫在一元組中,元組的第一項為目標主機 IP 地址,第二項為接受數據的埠號:
其中,IP 地址使用字元串類型,埠號使用數字類型。
如果不綁定埠,每次使用 Socket 時都會由操作系統動態分配一個埠,我們也可以綁定為某個固定的埠。這樣做的好處是:如果我們想要接受其他主機的信息,其他主機可以直接向這個埠發送數據,如果使用動態埠的話,發送方並不知道目標埠是什麼,因此無法向接收方發送數據。
綁定埠需要使用 Socket 對象的 bind 方法:
bind 方法接受一個元組作為參數,元組的第一項為綁定的 IP 地址,第二項為綁定的埠號。我們可以把第一項指定為本機上的任意一個 IP 地址,也可以設置為一個空字元串 "" ,表示本機上任意合法的 IP 地址。
使用 UDP 套接字協議時,發送數據使用 Socket 對象的 sendto 方法,接受數據使用 Socket 對象的 recvfrom 方法。這兩個方法的使用方式如下:
sendto 方法接受兩個參數:發送的數據和目標主機的 IP 和埠元組,在 Python3 中,發送的數據應該轉為 byte 類型發送,Python2 中可以直接發送字元串。
recvfrom 接受一個參數:本次接受的最大數據尺寸。該方法是阻塞的,只有在接收到數據後才能進行後續的操作。
就像使用文件那樣,在使用完套接字後,需要關閉它,調用 close 方法即可。
上面我們介紹了 Socket 的使用方式,下面我們來做一個單工通信的例子(一方負責發送信息,一方負責接收信息)。
我們這里來創建兩個文件:用以發送信息的 send.py 和用以接收信息的 recv.py。該實例在虛擬機中模擬(注意將虛擬機設置為橋接模式)。
創建 send.py:
創建 recv.py:
運行結果如下:
上面實現了一個單工通信的例子:一方負責發,一方負責接收。下面我們繼續實現一個雙工通信的例子,使雙方都能夠收發消息。
由於接收和發送消息時是使用 while 循環不斷輪詢的,因此要實現同時發送和接受,我們需要進行多任務處理。
新建一個 msg.py:
這里我們使用 3000 埠發送數據,3001 埠接收數據,運行程序時只需填寫目標主機的 IP 地址,就可以進行通信。
運行效果:
我們還可以進行區域網內的廣播,只需對 Socket 加上一條設置:
同時,發送廣播需要一個廣播地址,以及目標主機接受廣播的埠:
上面的設置只能給 0 網段的主機發送廣播,要想給區域網中所有的主機發送廣播,可以這樣設置:
下面我們新建一個 send.py 用來發送廣播:
新建一個 recv.py 用來接收廣播:
運行效果如圖:
完。