一.概念:
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...