五 網路程式設計 UDP 不黏包)

2022-07-13 17:30:11 字數 3007 閱讀 8498

一 .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)

client1

from 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='')

server1

from 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....