導航:首頁 > 編程語言 > python讀取udp包

python讀取udp包

發布時間:2022-10-06 15:51:26

python3套接字udp設置接受數據超時

Sometimes,you need to manipulate the default values of certain properties of a socket library, for example, the socket timeout.

設定並獲取默認的套接字超時時間。

1.代碼

1 import socket
2
3
4 def test_socket_timeout():
5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
6 print("Default socket timeout: %s" % s.gettimeout())
7 # 獲取套接字默認超時時間
8 s.settimeout(100)
9 # 設置超時時間
10 print("Current socket timeout: %s" % s.gettimeout())
11 # 讀取修改後的套接字超時時間
12
13
14 if __name__ == '__main__':
15 test_socket_timeout()
2. AF_INET和SOCK_STREAM解釋

1 # 地址簇
2 # socket.AF_INET IPv4(默認)
3 # socket.AF_INET6 IPv6
4 # socket.AF_UNIX 只能夠用於單一的Unix系統進程間通信
5
6 # socket.SOCK_STREAM(數據流) 提供面向連接的穩定數據傳輸,即TCP/IP協議.多用於資料(如文件)傳送。
3.gettimeout()和settimeout()解釋

1 def gettimeout(self): # real signature unknown; restored from __doc__
2 """
3 gettimeout() -> timeout
4
5 Returns the timeout in seconds (float) associated with socket
6 operations. A timeout of None indicates that timeouts on socket
7 operations are disabled.
8 """
9 return timeout
10
11
12 def settimeout(self, timeout): # real signature unknown; restored from __doc__
13 """
14 settimeout(timeout)
15
16 Set a timeout on socket operations. 'timeout' can be a float,
17 giving in seconds, or None. Setting a timeout of None disables
18 the timeout feature and is equivalent to setblocking(1).
19 Setting a timeout of zero is the same as setblocking(0).
20 """
21 pass
22 # 設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。
23 # 一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作(如 client 連接最多等待5s )
4.運行結果

1 Default socket timeout: None
2 Current socket timeout: 100.0

㈡ 如何用python方法檢測UDP埠

如何用python方法檢測UDP埠,首先要了解什麼是UDP埠及作用。網上搜索了一圈後,我得到的個人理解是:UDP埠是含有網路服務必須的源埠和目的埠信息,用以建立和實現網路傳輸服務。
那麼如何用python方法檢測UDP埠呢?看看下邊這段網友提供的代碼吧。
socket、threading、time、Queue這些是要用到的python方法模塊。

㈢ python截取無人機UDP包,如何解析內容

PYTHON首先要安裝scapy模塊

PY3的安裝scapy-python3,使用PIP安裝就好了,注意,PY3無法使用pyinstaller打包文件,PY2正常

PY2的安裝scapy,比較麻煩

㈣ 如何用python方法檢測UDP埠

本文實例講述了python檢測遠程udp埠是否打開的方法。分享給大家供大家參考。具體實現方法如下:

復制代碼代碼如下:
import socket
import threading
import time
import struct
import Queue
queue = Queue.Queue()
def udp_sender(ip,port):
try:
ADDR = (ip,port)
sock_udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock_udp.sendto("abcd...",ADDR)
sock_udp.close()
except:
pass
def icmp_receiver(ip,port):
icmp = socket.getprotobyname("icmp")
try:
sock_icmp = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
except socket.error, (errno, msg):
if errno == 1:
# Operation not permitted
msg = msg + (
" - Note that ICMP messages can only be sent from processes"
" running as root."
)
raise socket.error(msg)
raise # raise the original error
sock_icmp.settimeout(3)
try:
recPacket,addr = sock_icmp.recvfrom(64)
except:
queue.put(True)
return
icmpHeader = recPacket[20:28]
icmpPort = int(recPacket.encode('hex')[100:104],16)
head_type, code, checksum, packetID, sequence = struct.unpack(
"bbHHh", icmpHeader
)
sock_icmp.close()
if code == 3 and icmpPort == port and addr[0] == ip:
queue.put(False)
return
def checker_udp(ip,port):
thread_udp = threading.Thread(target=udp_sender,args=(ip,port))
thread_icmp = threading.Thread(target=icmp_receiver,args=(ip,port))
thread_udp.daemon= True
thread_icmp.daemon = True
thread_icmp.start()
time.sleep(0.1)
thread_udp.start()

thread_icmp.join()
thread_udp.join()
return queue.get(False)
if __name__ == '__main__':
import sys
print checker_udp(sys.argv[1],int(sys.argv[2]))

希望本文所述對大家的Python程序設計有所幫助。

㈤ 如何利用Python嗅探數據包

一提到Python獲取數據包的方式,相信很多Python愛好者會利用Linux的libpcap軟體包或利用Windows下的WinPcap可移植版的方式進行抓取數據包,然後再利用dpkt軟體包進行協議分析,我們這里想換一個角度去思考:1.Python版本的pcap存儲內存數據過小,也就是說緩存不夠,在高並發下容易發生丟包現象,其實C版本的也同樣存在這樣的問題,只不過Python版本的緩存實在是過低,讓人很郁悶。2.dpkt協議分析並非必須,如果你對RFC791和RFC793等協議熟悉的話,完全可以使用struct.unpack的方式進行分析。如果你平常習慣使用tcpmp抓取數據包的話,完全可以使用它來代替pcap軟體包,只不過我們需要利用tcpmp將抓取的數據以pcap格式進行保存,說道這里大家一定會想到Wireshark工具,具體命令如下:tcpmpdst10.13.202.116andtcpdstport80-s0-ieth1-w../pcap/tcpmp.pcap-C1k-W5我們首先需要對pcap文件格式有所了解,具體信息大家可以參考其他資料文檔,我這里只說其重要的結構體組成,如下:sturctpcap_file_header{DWORDmagic;WORDversion_major;WORDversion_minor;DWORDthiszone;DWORDsigfigs;DWORDsnaplen;DWORDlinktype;}structpcap_pkthdr{structtimevalts;DWORDcaplen;DWORDlen;}structtimeval{DWORDGMTtime;DWORDmicroTime;}這里需要說明的一點是,因為在Python的世界裡一切都是對象,所以往往Python在處理數據包的時候感覺讓人比較麻煩。Python提供了幾個libpcapbind,這里有一個最簡單的。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用。一個規范的抓包過程:importpcapimportdpktpc=pcap.pcap()#注,參數可為網卡名,如eth0pc.setfilter('tcpport80')#設置監聽過濾器forptime,pdatainpc:#ptime為收到時間,pdata為收到數據printptime,pdata#對抓到的乙太網V2數據包(rawpacket)進行解包:p=dpkt.ethernet.Ethernet(pdata)ifp.data.__class__.__name__=='IP':ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=='TCP':ifdata.dport==80:printp.data.data.data一些顯示參數nrecv,ndrop,nifdrop=pc.stats()返回的元組中,第一個參數為接收到的數據包,第二個參數為被核心丟棄的數據包。至於對於如何監控tcpmp生成的pcap文件數據,大家可以通過pyinotify軟體包來實現,如下:classPacker(pyinotify.ProcessEvent):def__init__(self,proct):self.proct=proctself.process=Nonedefprocess_IN_CREATE(self,event):logger.debug("createfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_MODIFY(self,event):self.process_IF_START_THREAD(event)logger.debug("modifyfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_DELETE(self,event):filename=os.path.join(event.path,event.name)logger.debug("deletefile:%s"%filename)defprocess_IF_START_THREAD(self,event):filename=os.path.join(event.path,event.name)iffilename!=self.process:self.process=filenameself.proct.put(filename)ifself.proct.qsize()>1:try:logger.debug("createconsumerproct.qsize:%s"%self.proct.qsize())consumer=Consumer(self.proct)consumer.start()exceptException,errmsg:logger.error("createconsumerfailed:%s"%errmsg)returnfilenameclassFactory(object):def__init__(self,proct):self.proct=proctself.manager=pyinotify.WatchManager()self.mask=pyinotify.IN_CREATE|pyinotify.IN_DELETE|pyinotify.IN_MODIFYdefwork(self):try:try:notifier=pyinotify.ThreadedNotifier(self.manager,Packer(self.proct))notifier.start()self.manager.add_watch("../pcap",self.mask,rec=True)notifier.join()exceptException,errmsg:logger.error("createnotifierfailed:%s"%errmsg)exceptKeyboardInterrupt,errmsg:logger.error("factoryhasbeenterminated:%s"%errmsg)在獲得要分析的pcap文件數據之後,就要對其分析了,只要你足夠了解pcap文件格式就可以了,對於我們來講只需要獲得TCP數據段的數據即可,如下:classWriter(threading.Thread):def__init__(self,proct,stack):threading.Thread.__init__(self)self.proct=proctself.stack=stackself.pcap_pkthdr={}defrun(self):whileTrue:filename=self.proct.get()try:f=open(filename,"rb")readlines=f.read()f.close()offset=24whilelen(readlines)>offset:self.pcap_pkthdr["len"]=readlines[offset+12:offset+16]try:length=struct.unpack("I",self.pcap_pkthdr["len"])[0]self.stack.put(readlines[offset+16:offset+16+length])offset+=length+16exceptException,errmsg:logger.error("unpackpcap_pkthdrfailed:%s"%errmsg)exceptIOError,errmsg:logger.error("openfilefailed:%s"%errmsg)在獲得TCP數據段的數據包之後,問題就簡單多了,根據大家的具體需求就可以進行相應的分析了,我這里是想分析其HTTP協議數據,同樣也藉助了dpkt軟體包進行分析,如下:defworker(memcache,packet,local_address,remote_address):try:p=dpkt.ethernet.Ethernet(packet)ifp.data.__class__.__name__=="IP":srcip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.src)))dstip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=="TCP":tcpacket=p.data.dataiftcpacket.dport==80anddstip==local_address:srcport=tcpacket.sportkey=srcip+":"+str(srcport)iftcpacket.data:ifnotmemcache.has_key(key):memcache[key]={}ifnotmemcache[key].has_key("response"):memcache[key]["response"]=Noneifmemcache[key].has_key("data"):memcache[key]["data"]+=tcpacket.dataelse:memcache[key]["data"]=tcpacket.dataelse:ifmemcache.has_key(key):memcache[key]["response"]=dpkt.http.Request(memcache[key]["data"])try:stackless.tasklet(connection)(memcache[key]["response"],local_address,remote_address)stackless.run()exceptException,errmsg:logger.error("connectremoteremote_addressfailed:%s",errmsg)logger.debug("oldheaders(nonecontent-length):%s",memcache[key]["response"])memcache.pop(key)exceptException,errmsg:logger.error("dpkt.ethernet.Ethernetfailedinworker:%s",errmsg)如果大家只是想單純的獲取IP地址、埠、流量信息,那麼問題就更簡單了,這里只是拋磚引玉。另外再提供一段代碼供參考:importpcap,dpkt,structimportbinasciidefmain():a=pcap.pcap()a.setfilter('udpportrange4000-4050')try:fori,pdataina:p=dpkt.ethernet.Ethernet(pdata)src='%d.%d.%d.%d'%tuple(map(ord,list(p.data.src)))dst='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))sport=p.data.data.sportdport=p.data.data.dport =int(binascii.hexlify(p.data.data.data[7:11]),16)print' :%d,From:%s:%d,To:%s:%d'%( ,src,sport,dst,dport)exceptException,e:print'%s'%en=raw_input()if__name__=='__main__':main()

㈥ python怎麼確認udp包的完整性

但是我python讀取udp包里的數據的時候,如果用recv(1024)這樣固定的緩沖區長度去讀取,有時候會不能把一條完整的數據報文讀取到

㈦ python udp發送數據的問題

一個簡單的python socket編程

一、套接字

套接字是為特定網路協議(例如TCP/IP,ICMP/IP,UDP/IP等)套件對上的網路應用程序提供者提供當前可移植標準的對象。它們允許程序接受並進行連接,如發送和接受數據。為了建立通信通道,網路通信的每個端點擁有一個套接字對象極為重要。

套接字為BSD UNIX系統核心的一部分,而且他們也被許多其他類似UNIX的操作系統包括Linux所採納。許多非BSD UNIX系統(如ms-dos,windows,os/2,mac os及大部分主機環境)都以庫形式提供對套接字的支持。

三種最流行的套接字類型是:stream,datagram和raw。stream和datagram套接字可以直接與TCP協議進行介面,而raw套接字則介面到IP協議。但套接字並不限於TCP/IP。

二、套接字模塊

套接字模塊是一個非常簡單的基於對象的介面,它提供對低層BSD套接字樣式網路的訪問。使用該模塊可以實現客戶機和伺服器套接字。要在python 中建立具有TCP和流套接字的簡單伺服器,需要使用socket模塊。利用該模塊包含的函數和類定義,可生成通過網路通信的程序。一般來說,建立伺服器連接需要六個步驟。

第1步是創建socket對象。調用socket構造函數。

socket=socket.socket(familly,type)

family的值可以是AF_UNIX(Unix域,用於同一台機器上的進程間通訊),也可以是AF_INET(對於IPV4協議的TCP和 UDP),至於type參數,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(數據報文套接字),SOCK_RAW(raw套接字)。

第2步則是將socket綁定(指派)到指定地址上,socket.bind(address)

address必須是一個雙元素元組,((host,port)),主機名或者ip地址+埠號。如果埠號正在被使用或者保留,或者主機名或ip地址錯誤,則引發socke.error異常。

第3步,綁定後,必須准備好套接字,以便接受連接請求。

socket.listen(backlog)

backlog指定了最多連接數,至少為1,接到連接請求後,這些請求必須排隊,如果隊列已滿,則拒絕請求。

第4步,伺服器套接字通過socket的accept方法等待客戶請求一個連接:

connection,address=socket.accept()

調用accept方法時,socket會進入'waiting'(或阻塞)狀態。客戶請求連接時,方法建立連接並返回伺服器。accept方法返回一個含有倆個元素的元組,形如(connection,address)。第一個元素(connection)是新的socket對象,伺服器通過它與客戶通信;第二個元素(address)是客戶的internet地址。

第5步是處理階段,伺服器和客戶通過send和recv方法通信(傳輸數據)。伺服器調用send,並採用字元串形式向客戶發送信息。send方法返回已發送的字元個數。伺服器使用recv方法從客戶接受信息。調用recv時,必須指定一個整數來控制本次調用所接受的最大數據量。recv方法在接受數據時會進入'blocket'狀態,最後返回一個字元串,用它來表示收到的數據。如果發送的量超過recv所允許,數據會被截斷。多餘的數據將緩沖於接受端。以後調用recv時,多餘的數據會從緩沖區刪除。

第6步,傳輸結束,伺服器調用socket的close方法以關閉連接。

建立一個簡單客戶連接則需要4個步驟。

第1步,創建一個socket以連接伺服器 socket=socket.socket(family,type)

第2步,使用socket的connect方法連接伺服器 socket.connect((host,port))

第3步,客戶和伺服器通過send和recv方法通信。

第4步,結束後,客戶通過調用socket的close方法來關閉連接。

python 編寫server的步驟:

第一步是創建socket對象。調用socket構造函數。如:

socket = socket.socket( family, type )

family參數代表地址家族,可為AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用於同一台機器上的進程間通信。
type參數代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數據報套接字)。

第二步是將socket綁定到指定地址。這是通過socket對象的bind方法來實現的:

socket.bind( address )

由AF_INET所創建的套接字,address地址必須是一個雙元素元組,格式是(host,port)。host代表主機,port代表埠號。如果埠號正在使用、主機名不正確或埠已被保留,bind方法將引發socket.error異常。

第三步是使用socket套接字的listen方法接收連接請求。

socket.listen( backlog )

backlog指定最多允許多少個客戶連接到伺服器。它的值至少為1。收到連接請求後,這些請求需要排隊,如果隊列滿,就拒絕請求。

第四步是伺服器套接字通過socket的accept方法等待客戶請求一個連接。

connection, address = socket.accept()

調用accept方法時,socket會時入「waiting」狀態。客戶請求連接時,方法建立連接並返回伺服器。accept方法返回一個含有兩個元素的元組(connection,address)。第一個元素connection是新的socket對象,伺服器必須通過它與客戶通信;第二個元素 address是客戶的Internet地址。
第五步是處理階段,伺服器和客戶端通過send和recv方法通信(傳輸數據)。伺服器調用send,並採用字元串形式向客戶發送信息。send方法返回已發送的字元個數。伺服器使用recv方法從客戶接收信息。調用recv 時,伺服器必須指定一個整數,它對應於可通過本次方法調用來接收的最大數據量。recv方法在接收數據時會進入「blocked」狀態,最後返回一個字元串,用它表示收到的數據。如果發送的數據量超過了recv所允許的,數據會被截短。多餘的數據將緩沖於接收端。以後調用recv時,多餘的數據會從緩沖區刪除(以及自上次調用recv以來,客戶可能發送的其它任何數據)。
傳輸結束,伺服器調用socket的close方法關閉連接。
python編寫client的步驟:
創建一個socket以連接伺服器:socket = socket.socket( family, type )

使用socket的connect方法連接伺服器。對於AF_INET家族,連接格式如下:

socket.connect( (host,port) )

host代表伺服器主機名或IP,port代表伺服器進程所綁定的埠號。如連接成功,客戶就可通過套接字與伺服器通信,如果連接失敗,會引發socket.error異常。
處理階段,客戶和伺服器將通過send方法和recv方法通信。
傳輸結束,客戶通過調用socket的close方法關閉連接。
下面給個簡單的例子:

server.py
python 代碼

if __name__ == '__main__':
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8001))
sock.listen(5)
while True:
connection,address = sock.accept()
try:
connection.settimeout(5)
buf = connection.recv(1024)
if buf == '1':
connection.send('welcome to server!')
else:
connection.send('please go out!')
except socket.timeout:
print 'time out'
connection.close()

client.py
python 代碼

if __name__ == '__main__':
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8001))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()

在終端運行server.py,然後運行clien.py,會在終端列印「welcome to server!"。如果更改client.py的sock.send('1')為其它值在終端會列印」please go out!「,更改time.sleep(2)為大於5的數值, 伺服器將會超時。

舉例:

服務端:

#socket server端
#獲取socket構造及常量
from socket import *
#''代表伺服器為localhost
myHost = ''
#在一個非保留埠號上進行監聽
myPort = 50007

#設置一個TCP socket對象
sockobj = socket(AF_INET, SOCK_STREAM)
#綁定它至埠號
sockobj.bind((myHost, myPort))
#監聽,允許5個連結
sockobj.listen(5)

#直到進程結束時才結束循環
while True:
#等待下一個客戶端連結
connection, address = sockobj.accept( )
#連結是一個新的socket
print 'Server connected by', address
while True:
#讀取客戶端套接字的下一行
data = connection.recv(1024)
#如果沒有數量的話,那麼跳出循環
if not data: break
#發送一個回復至客戶端
connection.send('Echo=>' + data)
#當socket關閉時eof
connection.close( )

客戶端:

import sys
from socket import *
serverHost = 'localhost'
serverPort = 50007

#發送至服務端的默認文本
message = ['Hello network world']
#如果參數大於1的話,連結的服務端為第一個參數
if len(sys.argv) > 1:
serverHost = sys.argv[1]
#如果參數大於2的話,連結的文字為第二個參數
if len(sys.argv) > 2:
message = sys.argv[2:]

#建立一個tcp/ip套接字對象
sockobj = socket(AF_INET, SOCK_STREAM)
#連結至伺服器及埠
sockobj.connect((serverHost, serverPort))

for line in message:
#經過套按字發送line至服務端
sockobj.send(line)
#從服務端接收到的數據,上限為1k
data = sockobj.recv(1024)
#確認他是引用的,是'x'
print 'Client received:', repr(data)

#關閉套接字
sockobj.close( )

㈧ python udp多線程的問題

for out_port in self.output_port:
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
soc.connect(("localhost",out_port))
_output.append(soc)

不要用output_port,用input_port。
你這里是往input_port發送數據,不需要關心自己的port,而是對端的port

㈨ python實現多地址UDP同時,高效接收

每個udp socket只能bind到一個本地埠上。你可以多搞幾個,然後加select就可以了。

閱讀全文

與python讀取udp包相關的資料

熱點內容
centos開機啟動命令 瀏覽:667
直播完整源碼java 瀏覽:542
二戰蘇日電影 瀏覽:37
台灣販賣婦女的電影 瀏覽:66
監控網頁端監控源碼 瀏覽:888
蘋果m1晶元前端開發編程問題 瀏覽:578
無法訪問共享文件夾找不到路徑 瀏覽:243
李恩美主演電影全集 瀏覽:665
主角是科技天才被國家保護的小說 瀏覽:703
電影院和好友老公親熱 瀏覽:883
長在脖子上像睾丸的電影 瀏覽:914
男主人公是醫生的一部韓國電影 瀏覽:336
投原子彈的電影 瀏覽:708
日本電影自行車反轉有個女的坐在上面 瀏覽:125
java瘋狂講義3 瀏覽:198
古裝4級片 瀏覽:386
清朝十部頂級電影 瀏覽:987
泰國鬼片哪兒看 瀏覽:587
電影睡起你的墳墓 瀏覽:968
有關動物的真人版英文電影 瀏覽:47