C 網路程式設計之UDP

2022-08-27 02:09:05 字數 4025 閱讀 4231

udp簡介:udp 是user datagram protocol的簡稱, 中文名是使用者資料報協議,是

一種無連線的傳輸層

協議,提供面向事務的簡單不可靠資訊傳送服務。udp是與tcp相對應的協議,它是面向非連線的協議,它不與對方連線,而直接把資料報傳送過去。「面向非連線」就是正式通訊前不必與對方建立連線,不管對方狀態就直接傳送。

udp特性:

(1)udp是乙個無連線協議,傳輸資料之前,源端和終端不建立連線,當它想傳送時就簡單的抓取來自應用程式的資料,並盡可能快的把他扔到網路上。在傳送端udp傳送的速度僅僅是受應用程式資料生成的速度、計算機能力和傳輸頻寬限制;在接收端,udp把每個訊息段放在佇列中,應用程式每次從佇列中讀取乙個訊息段。

(2)由於傳輸資料不建立連線,因此也就不需要維護連線狀態,包括收發狀態等,因此一台服務機可同時向多台客戶機傳輸相同的資訊。

(3)udp資訊包的標題很短,只有8個位元組,相對於tcp的20個位元組資訊包的額外開銷很小。

(4)吞吐量不受擁擠控制演算法的調節,只受應用軟體生成資料的速率、傳輸寬頻、源端和終端主機效能的限制。

(5)udp使用盡量最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的鏈結狀態表(該表中有許多引數)。

(6)udp是面向報文的。傳送方對應用程式交下來的報文,在新增首部後就向下交付個ip層。既不拆分,也不合併,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。

示例:在解決方案建立兩個控制台程式:udpsender,udpreceive

備註:(1)vs2012啟動兩個專案需設定:右鍵解決方案->通用屬性->啟動專案->多啟動專案->勾選你要啟動的多個專案->確定->啟動

(2)vs2012始終能看到解決方案的設定:工具->配置->專案和解決方案->常規->總是顯示解決方案

(3)ipendpoint類包含應用程式連線到主機的服務所需的主機和本地或遠端埠資訊。通過組合服務的主機ip位址和埠號,ipendpoint形成到服務的連線點。

客戶端:

using system;

using system.collections.generic;

using system.linq;

using system.net;

using system.net.sockets;

using system.text;

using system.threading.tasks;

namespace udpsender

class program

static void main(string args)

byte data = new byte[1024];

string input,stringdata;

console.writeline("this is a client.host name is ",dns.gethostname());

//設定伺服器ip和埠號

ipendpoint ipep = new ipendpoint(ipaddress.parse("127.0.0.1"),8001);

//定義網路型別,資料連線型別和網路協議udp

socket server = new socket(addressfamily.internetwork,sockettype.dgram,protocoltype.udp);

string welcome = "hello! i am a client";

data = encoding.ascii.getbytes(welcome);

server.sendto(data,data.length,socketflags.none,ipep);

ipendpoint sender = new ipendpoint(ipaddress.any,0);

endpoint remote = (endpoint)sender;

data = new byte[1024];

//對於不存在的ip位址,加入此行**後,可以在指定時間內解除阻塞模式限制

socketoptionname.receivetimeout, 100);

int recv = server.receivefrom(data,ref remote);

console.writeline("message received from : ", remote.tostring());

console.writeline(encoding.ascii.getstring(data, 0, recv));

while(true)

input = console.readline();

if(input == "exit")

break;

server.sendto(encoding.ascii.getbytes(input),remote);

data = new byte[1024];

recv = server.receivefrom(data,ref remote);

stringdata = encoding.ascii.getstring(data,0,recv);

console.writeline(stringdata);

using system;

using system.collections.generic;

using system.linq;

using system.net;

using system.net.sockets;

using system.text;

using system.threading.tasks;

namespace udpreceive

class program

static void main(string args)

int recv;

byte data = new byte[1024];

//得到本機ip,設定埠號

ipendpoint ipep = new ipendpoint(ipaddress.any,8001);

socket newsock = new socket(addressfamily.internetwork,sockettype.dgram,protocoltype.udp);

//繫結網路位址

newsock.bind(ipep);

console.writeline("this is a server, host name is ", dns.gethostname());

//等待客戶機連線

console.writeline("waiting for a client");

//得到客戶端ip

ipendpoint sender= new ipendpoint(ipaddress.any,0);

endpoint remote = (endpoint)(sender);

//接受資料

recv = newsock.receivefrom(data,ref remote);

console.writeline("message received from ",remote.tostring());

console.writeline(encoding.ascii.getstring(data,0,recv));

//客戶端連線成功後,傳送資訊

string welcome = "hi i am a server";

data = encoding.ascii.getbyte(welcome);

//傳送資訊

newsock.sendto(data,data.length,socketflags.none,remote);

while(true)

data = new byte[1024];

//傳送接受的資訊

recv = newsock.receivefrom(data,ref remote); 

console.writeline(encoding.ascii.getstring(data,0,recv));

newsock.sendto(data,recv,socketflags.none,remote);

C 網路程式設計之UDP

udp和tcp是網路通訊常用的兩個傳輸協議,c 一般可以通過socket來實現udp和tcp通訊,由於.net框架通過udpclient tcplistener tcpclient這幾個類對socket進行了封裝,使其使用更加方便,本文就通過這幾個封裝過的類講解一下相關應用。與tcp通訊不同,udp...

網路程式設計之UDP協議

將資料及源和目的封裝成資料報,不需要建立連線。每個資料報的大小限制在64k內。因無連線,是不可靠的協議,但是速度快。客戶端 1 建立udp傳輸的傳送端 2 建立udp的socket服務 3 將要傳送的資料封裝到資料報中 4 通過udp的socket服務獎資料報傳送過去 5 關閉socket服務 pu...

Linux 網路程式設計之UDP

1.介紹 udp協議是無連線的,不可靠傳輸的協議.伺服器與客戶端的互動不需要建立連線,沒有流量控制的功能。與tcp一樣,它也是傳輸層協議,通訊過程中需要ip位址與埠號。使用udp進行程式設計包括伺服器與客戶端,下面介紹一下伺服器與客戶端的通訊流程 伺服器流程 1 建立伺服器套接字描socket 2 ...