python套接字
Ⅰ 如何使用證書存儲在python中的字元串變數打開ssl套接字
查看源代碼,ssl.wrap_socket直接調用本地代碼(openssl)函數SSL_CTX_use_cert_chain_file,它需要一個文件的路徑,因此您無法做的是嘗試做的。
參考:
在ssl
/
init
.py中,我們看到:
def
wrap_socket(sock,keyfile
=無,certfile
=無,
server_side
=
False,cert_reqs
=
CERT_NONE,
ssl_version
=
PROTOCOL_SSLv23,ca_certs
=
None,
do_handshake_on_connect
=
True):
return
SSLSocket
sock,keyfile
=
keyfile,certfile
=
certfile,
server_side
=
server_side,cert_reqs
=
cert_reqs,
ssl_version
=
ssl_version,ca_certs
=
ca_certs,
do_handshake_on_connect
=
do_handshake_on_connect)
將我們指向SSLSocket構造函數(它在同一個文件中),我們看到以下情況:
self._sslobj
=
_ssl2.sslwrap(self._sock,server_side,
keyfile,certfile,
cert_reqs,ssl_version,ca_certs)
_ssl2在C(_ssl2.c)中實現
查看sslwrap函數,我們看到它正在創建一個新對象:
return(PyObject
*)newPySSLObject(Sock,key_file
,cert_file,
server_side,verification_mode,
protocol,cacerts_file);
查看該對象的構造函數,我們最終會看到:
ret
=
SSL_CTX_use_certificate_chain_file(self->
ctx,
cert_file);
這個函數在openssl中定義,所以現在我們需要切換到那個代碼庫。
在ssl
/
ssl_rsa.c中,我們最終在函數中找到:
BIO_read_filename
in,file)
如果你深入到BIO代碼(openssl的一部分)最終成為正常的fopen():
fp
=
fopen(ptr,p)
所以它看起來像它當前寫的。它必須在C的fopen()可打開的文件中。
此外,由於python的ssl庫很快跳轉到C,我在一個解決方法中看不到一個明顯的monkeypatch的地方。
Ⅱ 怎麼用python和原始套接字發送一tcp數據包
TCP的首部格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
—Source Port是源埠,16位。
—Destination Port是目的埠,16位。
—Sequence Number是發送數據包中的第一個位元組的序列號,32位。
—Acknowledgment Number是確認序列號,32位。
—Data Offset是數據偏移,4位,該欄位的值是TCP首部(包括選項)長度乘以4。
—標志位: 6位,URG表示Urgent Pointer欄位有意義:
ACK表示Acknowledgment Number欄位有意義
PSH表示Push功能,RST表示復位TCP連接
SYN表示SYN報文(在建立TCP連接的時候使用)
FIN表示沒有數據需要發送了(在關閉TCP連接的時候使用)
Window表示接收緩沖區的空閑空間,16位,用來告訴TCP連接對端自己能夠接收的最大數據長度。
—Checksum是校驗和,16位。
—Urgent Pointers是緊急指針,16位,只有URG標志位被設置時該欄位才有意義,表示緊急數據相對序列號(Sequence Number欄位的值)的偏移。
更多TCP協議的詳細信息可以在網上輕易找到,在這里不再贅述。
為了建立一個可以自己構造數據的包,我們使用"SOCK_RAW"這種socket格式,使用"IPPROTO_RAW"協議,它會告訴系統我們將提供網路層和傳輸層。
s = socket.socket(socket.AF_INET,socket.SOCK_RAW,)
通過這個簡單的類,我們可以進行IP頭部信息構造
class ip(object):
def __init__(self, source, destination):
self.version = 4
Ⅲ 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是什麼Python可以干什麼
Python(發音:英[ˈpaɪθən],美[ˈpaɪθɑ:n]),是一種易學且功能強大的編程語言。
這種語言的名字(Python意為「蟒蛇」)來自於BBC節目「Monty Python的飛行馬戲團」,而與爬行動物沒有關系。在文檔中用Monty Python來開玩笑不只是可以的,還是可以推薦的!
Python具有高級有效的數據結構和簡單有效的面向對象編程。
Python優雅的語法和動態類型,加上它的解釋性,使它成為很多編程平台開放開源和快速開發應用的理想語言。
Python 解釋器及豐富的標准庫以源碼或機器碼的形式提供,可以到 Python 官網 www.python.org 免費獲取。在下載時要注意你所使用的操作系統類型。在這個官方網站上還提供了許多免費的第三方 Python 模塊、程序和工具以及附加文檔的發布頁面或鏈接。
Python很容易使用,但它是一種真正的編程語言,提供了很多數據結構,也支持大型程序,遠超shell腳本或批處理文件的功能。Python還提供比C語言更多的錯誤檢查,而且作為一種「超高級語言」,它有高級的內置數據類型,比如靈活的數組和字典。正因為這些更加通用的數據類型,Python能夠應付更多的問題,超過Awk甚至Perl,而且很多東西在Python中至少和那些語言同樣簡單。
Python 允許你劃分程序模塊,在其他的 Python 程序中重用。它內置了很多的標准模塊,你可以在此基礎上開發程序——也可以作為例子,開始學習 Python 編程。例如,文件輸入輸出,系統調用,套接字,甚至圖形界面介面工作包比如 Tk 。
Python是一種解釋型語言,在程序開發階段可以為你節省大量時間,因為不需要編譯和鏈接。解釋器可以互動式使用,這樣就可以方便地嘗試語言特性,寫一些一次性的程序,或者在自下向上的程序開發中測試功能。
Python也是一個順手的桌面計算器。
Python程序的書寫是緊湊而易讀的。Python代碼通常比同樣功能的C,C++,Java代碼要短很多,原因列舉如下:
(1)高級數據類型允許在一個表達式中表示復雜的操作;
(2)代碼塊的劃分是按照縮進而不是成對的花括弧;
(3)不需要預先定義變數或參數。
Python是「可擴展的」:如果你知道怎麼寫C語言程序,就能很容易地給解釋器添加新的內置函數或模塊,不論是讓關鍵的程序以最高速度運行,還是把Python程序鏈接到只提供預編譯程序的庫(比如硬體相關的圖形庫)。一旦你真正鏈接上了,就能在Python解釋器中擴展或者控制C語言編寫的應用了。
Python本身提供了非常完善的基礎代碼庫,覆蓋了網路、文件、GUI、資料庫、文本等大量內容。所以,使用Python開發程序,你不必從0開始做,使用基礎代碼庫或第三方庫就可以輕松幫助你完成大量的工作。
在實際中,許多大型網站就是用Python開發的,例如YouTube、Instagram,還有國內的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國航空航天局)都在大量地使用Python。因此,你學習或使用Python並不孤單。
但是,Python並不是完美的,也並非萬能的。它的第一個缺點就是運行速度慢,由於Python是解釋型語言,與其它編譯型語言比起來要慢得多,不過當前的計算機硬體和網路設備的性能改善很多,而且很多情況下,你不需要那麼快的速度去做工作,Python的慢性子是可以忍受的。
它的第二個缺點就是代碼是可見的,你編寫的Python程序共享給其他人時,其他人是可以看到源代碼的,這一方面是由於Python的宗旨是開源共享,另外一方面是它是解釋型的,拿過來,用你的Python解釋器直接解釋運行就可以了,沒必要封裝編譯成機器代碼。
(註:本文整理了官方文檔與網路其它文檔中的一些內容)
本號將在今後逐步發布Python方面的文章,希望你能收藏關注本號,有空來看看,留下你的足跡,給本站前行的動力。
微信搜索 「優雅的代碼」 關注本站的公眾號,以獲取最新內容。
個人成長離不開各位的關注,你的關注就是我繼續前行的動力。
Ⅳ python無法立即完成一個非阻止性套接字操作
你使用了非阻塞模式,而10035表示數據還沒有返回給你。
你可以在接收前先select一下,如果有數據就接受,沒有就跳過。
你可參考python官方文檔
http://docs.python.org/howto/sockets.html
裡面有Non-blocking Sockets的一章可以看看。
import select
...
while 1:
infds,outfds,errfds = select.select([s,],[],[],5)
if len(infds) >0:
....
else:
print "no data coming"
Ⅵ python socketserver和socket的區別
區別:
1.首先介紹下socket
socket的英文原義是「孔」或「插座」。作為BSD UNIX的進程通信機制,取後一種意思。通常也
稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一 般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。Socket正如其英文原 意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務
內部調用流程為:
啟動服務端程序
執行 TCPServer.init方法,創建服務端Socket對象並綁定 IP 和 埠
執行 BaseServer.init方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 - MyRequestHandle賦值給 self.RequestHandlerClass
執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 ...
當客戶端連接到達伺服器
執行 ThreadingMixIn.process_request 方法,創建一個 「線程」 用來處理請求
執行 ThreadingMixIn.process_request_thread 方法
執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)
ForkingTCPServer
ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 「線程」 和 「進程」。
Ⅶ Python 之 Socket編程(TCP/UDP)
socket(family,type[,protocal]) 使用給定的地址族、套接字類型、協議編號(默認為0)來創建套接字。
有效的埠號: 0~ 65535
但是小於1024的埠號基本上都預留給了操作系統
POSIX兼容系統(如Linux、Mac OS X等),在/etc/services文件中找到這些預留埠與的列表
面向連接的通信提供序列化、可靠的和不重復的數據交付,而沒有記錄邊界。意味著每條消息都可以拆分多個片段,並且每個消息片段都能到達目的地,然後將它們按順序組合在一起,最後將完整的信息傳遞給等待的應用程序。
實現方式(TCP):
傳輸控制協議(TCP), 創建TCP必須使用SOCK_STREAM作為套接字類型
因為這些套接字(AF_INET)的網路版本使用網際網路協議(IP)來搜尋網路中的IP,
所以整個系統通常結合這兩種協議(TCP/IP)來進行網路間數據通信。
數據報類型的套接字, 即在通信開始之前並不需要建議連接,當然也無法保證它的順序性、可靠性或重復性
實現方式(UDP)
用戶數據包協議(UDP), 創建UDP必須使用SOCK_DGRAM (datagram)作為套接字類型
它也使用網際網路來尋找網路中主機,所以是UDP和IP的組合名字UDP/IP
注意點:
1)TCP發送數據時,已建立好TCP連接,所以不需要指定地址。UDP是面向無連接的,每次發送要指定是發給誰。
2)服務端與客戶端不能直接發送列表,元組,字典。需要字元串化repr(data)。
TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬體資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
什麼時候應該使用TCP : 當對網路通訊質量有要求的時候,比如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸.
UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊……
UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網路質量不好,就會很容易丟包。
什麼時候應該使用UDP: 當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP ……
Ⅷ 如何為python中的套接字設置發送緩沖區大小
使用socket.setsockopt()和SO_SNDBUF:
socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, <value>)
<value>是要設置為Python的緩沖區大小。int。
socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 8192) # Buffer size 8192
Ⅸ python socket編程中listen和accept的區別
listen函數在一般在調用bind之後-調用accept之前調用,它的函數原型是:
intlisten(int sockfd, int backlog)
參數sockfd
被listen函數作用的套接字,sockfd之前由socket函數返回。在被socket函數返回的套接字fd之時,它是一個主動連接的套接字,也就是此時系統假設用戶會對這個套接字調用connect函數,期待它主動與其它進程連接,然後在伺服器編程中,用戶希望這個套接字可以接受外來的連接請求,也就是被動等待用戶來連接。由於系統默認時認為一個套接字是主動連接的,所以需要通過某種方式來告訴系統,用戶進程通過系統調用listen來完成這件事。
參數backlog
這個參數涉及到一些網路的細節。進程處理一個一個連接請求的時候,可能還存在其它的連接請求。因為TCP連接是一個過程,所以可能存在一種半連接的狀態,有時由於同時嘗試連接的用戶過多,使得伺服器進程無法快速地完成連接請求。如果這個情況出現了,伺服器進程希望內核如何處理呢?內核會在自己的進程空間里維護一個隊列以跟蹤這些完成的連接但伺服器進程還沒有接手處理或正在進行的連接,這樣的一個隊列內核不可能讓其任意大,所以必須有一個大小的上限。這個backlog告訴內核使用這個數值作為上限。
毫無疑問,伺服器進程不能隨便指定一個數值,內核有一個許可的范圍。這個范圍是實現相關的。很難有某種統一,一般這個值會小30以內。
accept函數
摘要:accept()用來接受參數s的socket連接,它的函數原型是:
intaccept(int s,struct sockaddr * addr,int * addrlen)
服務程序調用accept函數從處於監聽狀態的流套接字s的客戶連接請求隊列中取出排在最前的一個客戶請求,並且創建一個新的套接字來與客戶套接字創建連接通道,如果連接成功,就返回新創建的套接字的描述符,以後與客戶套接字交換數據的是新創建的套接字;如果失敗就返回 INVALID_SOCKET。該函數的第一個參數指定處於監聽狀態的流套接字;操作系統利用第二個參數來返回新創建的套接字的地址結構;操作系統利用第三個參數來返回新創建的套接字的地址結構的長度。
Ⅹ 套接字初始化後可立即通訊嗎
可以。Python是一款大型的國產編程軟體,在軟體中,套接字初始化後,是可立即通訊的,該軟體操作簡單,上手快,是一款很好的軟體。