粘包問題,以及在python中如何呼叫作業系統命令

2022-02-08 15:45:47 字數 1793 閱讀 7423

一.新模組'subprocess'

複習: 在os模組中呼叫系統命令

import

osf = os.popen('

dir'

)print

(f.read())

上面的結果和下面的寫法是一樣的

import

subprocess

r = subprocess.popen('

ls',shell=true,stdout=subprocess.pipe,stderr=subprocess.pipe)

#subprocess.popen(cmd,shell=true,subprocess.stdout,subprocess.stderr)

#cmd : 代表系統命令

#shell = true 代表這條命令是 系統命令,告訴作業系統,將cmd當成系統命令去執行

#stdout 是執行完系統命令之後,用於儲存結果的乙個管道

#stderr 是執行完系統命令之後,用於儲存錯誤結果的乙個管道

stdout = r.stdout.read().decode('

gbk'

)stderr = r.stderr.read().decode('

gbk'

)print('

正確的返回結果:

',stdout)

print('

錯誤的返回結果:

',stderr)

print('

錯誤的返回結果:

',stderr)

二.粘包問題  (只有tcp協議才會傳送粘包,udp不會發生)

ex: 傳送端傳送資料,接收端不知道應該如何去接收,造成的一種資料混亂的現象

1.合包機制(nagle演算法):將多次連續傳送且間隔較小的資料,進行打包成一塊資料傳送. 

2.拆包機制:還有乙個機制是拆包機制,在傳送端,因為受到網絡卡的mtu限制,會將大的超過mtu限制

的資料,進行拆分,拆分成多個小的資料

,進行傳輸.  當傳輸到目標主機的作業系統層時,會重新將多個小的資料合併成原本的資料

針對 使用udp協議傳送資料,一次收發大小究竟多少合適?udp不會發生粘包,udp協議本層對一次收發資料大小的限制是:

65535 - ip包頭(20) - udp包頭(8) = 65507站在資料鏈路層,因為網絡卡的mtu一般被限制在了1500,所以對於資料鏈路層來說,

一次收發資料的大小被限制在 1500 - ip包頭(20) - udp包頭(8) = 1472得到結論:

如果sendto(num)

num > 65507報錯

1472 < num < 65507會在資料鏈路層拆包,而udp本身就是不可靠協議,所以一旦拆包之後,造成的多個小資料報在網路傳輸中,如果丟任何乙個,那麼此次資料傳輸失敗

num

< 1472 是比較理想的狀態

TCP 粘包問題以及解決

如果傳送端資料傳送過塊,接收端的資料接受過慢,接受端tcp內部的快取區域會溢位,無法再傳送資料,造成網路阻塞。所以每次要盡可能的把緩衝區資料讀出來,而不是每次讀一條訊息頭。因此要在應用層設定第二緩衝區,再從第二緩衝區讀資料,拆分包 完整說明 緩衝區 char szrecv recv buff szi...

解決粘包問題(python)

在傳輸資料訊息時因為tcp協議使用了優化方法 nagle演算法 將多次間隔較小且資料量小的資料,合併成乙個大的資料塊,然後進行封包,這樣,接收端就難於分辨出來了,所以會產生粘包效果。在這種情況下我們需要製作乙個報頭來告訴接收端我們要傳送的資料的長度,來方便接收端接收。第一步 製作固定長度的報頭 he...

Python中Socket粘包問題的解決

伺服器端 import socket import subprocess import struct server socket.socket ip port 192.168.15.33 8001 server.bind ip port server.listen conn,addr server....