c 網路程式設計3 UDP程式設計

2021-06-12 08:04:00 字數 2750 閱讀 7889

一.概念:

udp是傳輸層中面向無連線的協議,所以udp丟包後是不會重傳的,而且他在程式設計上服務端和客戶端是沒有區別的,有的只是「虛擬上」的服務端和客戶端,他在程式設計的實現上也很簡單,不像tcp那麼複雜。

二.udp終端的程式設計

由於udp在服務端和客戶端是一樣的,所以稱為udp終端,程式設計步驟如下:

1.載入套接字

word wversionrequested;

wversionrequested=makeword(1,1);//指定winsock庫的版本:1.1

wsadata wsadata;

int err;

//使用wsastartup載入套接字型檔,以及確定使用的套接字型檔的版本,這裡使用的是1.1的版本

err=wsastartup(wversionrequested,&wsadata);

if(err!=0)

return false;

if(lobyte(wsadata.wversion)!=1||hibyte(wsadata.wversion)!=1)

和tcp的載入套接字沒區別

2.建立套接字

socket sock;

unsigned long mode=1;//0:阻塞

int nret;

sock=socket(af_inet,sock_dgram,0);

與tcp區別再與socket的第二個引數,這裡是sock_dgram(資料式套接字),tcp的是sock_stream(流式套接字)

3.繫結套接字(這部是必須的,在終端開啟埠)

//lpctstr在unicode環境下是const wchar *,非unicode環境下是const char *

//inaddr_any表示如果一台機器上(伺服器)有多塊網絡卡,每個網絡卡都有各自的ip,則inaddr_any

//會將套接字繫結到該機器上的所有網絡卡位址和埠上

sockaddr_in addrsrv;

if(localip==null)

addrsrv.sin_addr.s_un.s_addr= htonl(inaddr_any);//由於這裡需要網路位元組序,所以將主機位元組序轉換成網路位元組序

else

addrsrv.sin_addr.s_un.s_addr=inet_addr(localip);//inet_addr將字串ip轉換成long型

addrsrv.sin_family=af_inet;

addrsrv.sin_port=htons(localport);//由於這裡需要網路位元組序,所以將主機位元組序轉換成網路位元組序

//下面的**等效於這行**return bind(hsocket,(sockaddr *)&addrsrv,sizeof(sockaddr))==0;

if(bind(sock,(sockaddr *)&addrsrv,sizeof(sockaddr))==0)

return true;

else

return false;

rlen=recvfrom(sock,(char *)recvbuffer,recvbufferlen,0,(sockaddr *)&addrfrom,addrdatalen);

if(rlen<=0)

recvbuffer是接受到的資料,recvbufferlen是需要一次接收的資料長度,rlen是實際接收的資料長度,addrfrom可以獲取傳送資料的udp終端的位址和埠

注意: 雖然這裡可以設定一次接收的資料長度recvbufferlen,但是這個長度必須需要系統快取的支援,系統有乙個接收資料的快取,這個快取負責將網路傳過來的資料放入其中,然後recv是從這個系統緩訪問資料,系統預設的socket接受快取的大小為8688b(8.6k左右),如果sock函式recv或recvfrom從系統快取中接受資料太慢,那麼系統接受到新資料後就會將原快取給覆蓋了,這樣在次呼叫recv函式就獲取到了新資料,老資料就丟失了,這時候就要使用setsockopt方法將系統快取開到32k最合適,如下:

if(setsockopt(sock,sol_socket,so_rcvbuf,(const char *)&max_recvfrom_buffer_size,sizeof(int))!=0)

max_recvfrom_buffer_size=32*1024b,在建立乙個客戶端的套接字之後就要使用setsockopt來設定系統快取的大小了,也就是第2部做完後就要設定系統快取

5.使用sendto來傳送資料(tcp使用的是send)

sockaddr_in addrto;

addrto.sin_addr.s_un.s_addr=inet_addr(ip);//inet_addr將字串ip轉換成long型

addrto.sin_family=af_inet;

addrto.sin_port=htons(port);

sendto(sock,sendbuffer,sendbuflen,0,(sockaddr*)&addrto,sizeof(sockaddr));

sendbuffer是傳送的資料,sendbuflen是一次傳送資料的長度,sockaddr_in這個結構填入需要傳送到的目的ip和埠,這裡的傳送長度要考慮網路最大的傳輸單元mtu=1500b,傳送的資料長度控制在1400b較好。

網路程式設計(3) Udp通訊基礎 Udp實現聊天

不需要連線伺服器 public class udpclientdemo1 仍然需要等待客戶端的連線 public class udpserverdemo1 public datagrampacket byte buf,int offset,int length public datagrampack...

C 網路程式設計之UDP

udp簡介 udp 是user datagram protocol的簡稱,中文名是使用者資料報協議,是 一種無連線的傳輸層 協議,提供面向事務的簡單不可靠資訊傳送服務。udp是與tcp相對應的協議,它是面向非連線的協議,它不與對方連線,而直接把資料報傳送過去。面向非連線 就是正式通訊前不必與對方建立...

C 網路程式設計之UDP

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