一 .udp不黏包 會丟包
1. 不黏包 丟包
udp(user datagram protocol,使用者資料報協議)是無連線的,面向訊息的,提供高效率服務。不會使用塊的合併優化演算法,, 由於udp支援的是一對多的模式,所以接收端的skbuff(套接字緩衝區)採用了鏈式結構來記錄每乙個到達的udp包,在每個udp包中就有了訊息頭(****位址,埠等資訊)
,這樣,對於接收端來說,就容易進行區分處理了。 即面向訊息的通訊是有訊息保護邊界的。
對於空訊息:tcp是基於資料流的,於是收發的訊息不能為空,這就需要在客戶端和服務端都新增空訊息的處理機制,
防止程式卡住,而udp是基於資料報的,即便是你輸入的是空內容(直接回車),也可以被傳送,udp協議會幫你封裝上訊息頭髮送過去。
不可靠不黏包的udp協議:udp的recvfrom是阻塞的,乙個recvfrom(x)必須對唯一乙個sendinto(y)
,收完了x個位元組的資料就算完成,若是y;x資料就丟失,這意味著udp根本不會粘包,但是會丟資料,不可靠。
用udp協議傳送時,用sendto函式最大能傳送資料的長度為:65535- ip頭(20) – udp頭(8)=65507位元組。用sendto函式傳送資料時,如果傳送資料長度大於該值,則函式會返回錯誤。(丟棄這個包,不進行傳送)
2 .基於udp協議實現不黏包 丟包
基於udp先製作乙個遠端執行命令的程式(命令ls -l ; lllllll ; pwd)
client1from socket import *ip_port=('
127.0.0.1
',9000)
client=socket(af_inet,sock_dgram)
while
true:
msg=input('
>>:
').strip()
client.sendto(msg.encode(
'utf-8
'),ip_port)
err,addr=client.recvfrom(1024)
out,addr=client.recvfrom(1024)
iferr:
print('
error : %s
'%err.decode('
utf-8
'),end=''
)
ifout:
print(out.decode('
utf-8
'), end='')
server1from socket import *
import
subprocess
ip_port=('
127.0.0.1
',9000)
server=socket(af_inet,sock_dgram)
server.setsockopt(sol_socket,so_reuseaddr,1)
server.bind(ip_port)
while
true:
#收訊息
cmd,addr=server.recvfrom(1024)
#邏輯處理
res=subprocess.popen(cmd.decode('
utf-8
'),shell=true,stderr=subprocess.pipe,stdin=subprocess.pipe,stdout=subprocess.pipe)
stderr=res.stderr.read()
stdout=res.stdout.read()
#發訊息
server.sendto(stderr,addr)
server.sendto(stdout,addr)
server.close()
server1#udp
#udp 永遠 不會黏包
#只有tcp有粘包現象,udp永遠不會粘包
#但是會丟包##
#udp不會發生黏包
#_*_coding:utf-8_*_
from socket import *
import
subprocess
ip_port=('
127.0.0.1
',9000)
bufsize=1024udp_server=socket(af_inet,sock_dgram)
udp_server.setsockopt(sol_socket,so_reuseaddr,1)
udp_server.bind(ip_port)
while
true:
#收訊息
cmd,addr=udp_server.recvfrom(bufsize)
print('
使用者命令----->
',cmd)
#邏輯處理
res=subprocess.popen(cmd.decode('
utf-8
'),shell=true,stderr=subprocess.pipe,stdin=subprocess.pipe,stdout=subprocess.pipe)
stderr=res.stderr.read()
stdout=res.stdout.read()
#發訊息
udp_server.sendto(stderr,addr)
udp_server.sendto(stdout,addr)
udp_server.close()
Note1 網路程式設計概述,UDP程式設計
一,什麼是網路程式設計?所謂的網路程式設計就是,讓在不同的電腦上的軟體能夠進行資料傳遞,即程序之間的通訊 二,tcp ip協議簡介 為了把全世界的所有不同型別的計算機都連線起來,就必須規定一套全球通用的協議,為了實現網際網路這個目標,網際網路協議簇 internetprotocolsuite 就是通...
Python 13 網路程式設計 UDP模型
import socket socket.af inet ipv4 socket.sock stream tcp socket.sock dgram udp s socket.socket socket.af inet,socket.sock dgram 監聽 ip port host name s...
三 網路程式設計 套接字UDP協議)
一 套接字udp協議 1.基於udp協議的socket tcp是基於鏈結的,必須先啟動服務端,然後再啟動客戶端去鏈結服務端 import socket udp sk socket.socket type socket.sock dgram 建立乙個伺服器的套接字 udp sk.bind 127.0....