2016-05-03 32 views
4

像tcp和udp這樣的協議都是用數字表示的。如何將協議號碼與python命名?

import socket 
socket.getprotocobyname('tcp') 

上面的代碼將返回6.

我怎樣才能得到該協議的名稱,如果我知道這個協議是多少?

+2

請參閱https://bugs.python.org/issue24809 – cdarke

+0

Python 2或Python 3? – cdarke

回答

3

我想說的是幾乎肯定有更好的方法,但是所有的協議名稱(和值)都被存儲爲以"IPPROTO"爲前綴的常量,因此您可以通過遍歷數組中的值來創建查找表模塊:

import socket 

table = {num:name[8:] for name,num in vars(socket).items() if name.startswith("IPPROTO")} 

>>> table[6] 
'TCP' 
+0

雖然它提供協議高達'6'這是tcp(3和5除外),它是無法超越的。說11是用於上面的腳本給出一個鍵錯誤的UDP。 – RatDon

+0

@RatDon'表[17] =='UDP'和根據[微軟的協議號碼](https://technet.microsoft.com/en-ca/library/cc959827.aspx)UDP與17.關聯確定11來自哪裏,但我坦率地不知道這方面的情況,對不起,我無法爲你提供更多的幫助。 –

+0

對不起,我的錯誤,我採取了'十一'的十六進制數。但是仍然沒有132是用於SCTP的。是的,我同意。幾個領域是可用的,但不是全部。不管怎樣,謝謝。 – RatDon

2

Python的socket模塊將做到這一點:在

>>> import socket 
>>> socket.getservbyport(6) 
'zip' 
>>> socket.getservbyport(80) 
'http' 

import socket 
socket.getservbyport(80) 

結果作爲socket.getservbyname(servicename[, protocolname])和socket.getservbyport(port[, protocolname])提到的文檔。第二個可選的協議名稱,如果給出的話,應該是'tcp'或'udp',否則任何協議都會匹配。

+0

是socket.getservbyport(6)「tcp」? –

+0

nope,它是'zip',我不認爲這是正確的東西 –

+0

@salomonderossi,你能夠以任何方式使用'getservbyport'來將'6'與'tcp'關聯嗎? OP在詢問「給出6我該如何取回'tcp'」,而你在答案中沒有這樣做。 –