UDP程式設計

2021-08-26 05:13:04 字數 3059 閱讀 7170

通常使用「點分十進位制」字串表示ip位址,用3個「.」劃分成四個區。每個區的表示範圍為0~255

埠號具有2個位元組16個位元位的整數

ip是將資料從a主機交付給b主機

埠號用來標識乙個程序,乙個埠號只能被乙個程序占用

ip位址+埠號=套接字,可以進行資料層面的來往,本質上就是程序間的通訊

每乙個程序都需要有pid,但不是所有程序都有埠號,除非這個程序投身於網路服務

乙個程序可以繫結多個埠號,但是乙個埠號不能繫結多個程序

認識tcp(傳輸控制協議)協議保證可靠性

超時重傳、面向連線、擁塞控制、按需到達、去重

傳輸層協議

有連線可靠

面向位元組流

認識udp(使用者資料報協議)協議:不保證可靠性

傳輸層協議

無連線不可靠

面向資料報

呼叫庫函式做網路位元組序列和主機位元組序的轉換:

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntonhl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

h表示host,n表示network

建立socket檔案描述符(tcp/udp,客戶端+伺服器)

int socket(int domain,int type,int protocol);

domain:套接字型別

af_unix :域間套接字,用來進行本地通訊

af_inet :使用ipv4

af_inet6:使用ipv6

type:表示服務型別

sock_dgram:無連線不可靠指定大小長度的服務

int protocol:協議型別,因為以上的設定明確表示使用的udp,所以這裡不用再設定,直接寫0

返回值:成功返回檔案描述符(以某種方式開啟網絡卡),失敗返回-1

網絡卡是乙個檔案,這樣就可以被程序操作,程序將操作的檔案放入自身的檔案描述符表中,通過檔案描述符來訪問檔案描述符表中的不同檔案,往檔案描述符上讀寫就是往網絡卡中讀寫

所謂檔案描述符本質上是pcb中檔案描述符表中的下標,以便找到這個檔案進行操作

繫結埠號

int bind(int socket,const struct sockaddr *address,socklen_t address_len);

socket:檔案描述符

address:繫結的埠號

成功返回0,失敗返回-1

開始監聽socket

int listen(int socket,int backlog);

接收請求

int accept(int socket,struct sockaddr*address,socklen_t*address_len);

建立連線

int connet(int sockfd,const struct sockadd*addr,socklen_t addrlen);

sockaddr這一類套接字介面可以接收任意型別,類似於void*,但出現在void*之前,可以根據位址型別來具體劃分介面型別

我們可以通過netstat -nlup 檢視udp伺服器

具體實現**:

伺服器端:

1 #include2 #include3 #include4 #include5 #include6 

7 int main(int argc,char* argv)

8 14 int sock=socket(af_inet,sock_dgram,0);

15 if(sock==-1)

16

20 struct sockaddr_in local;

21 local.sin_family=af_inet;//表示底層使用的協議是ipv4

22 local.sin_port=htons(atoi(argv[2]));//使用的埠號,網路中傳播的埠號為整形,

23 //這裡需要用atoi進行轉化,此外要把客戶端傳遞出去還需要將埠號轉化為網路位元組序列

24 local.sin_addr.s_addr=inet_addr(argv[1]);//使用的ip位址,此時的ip是類似與」192.168.43.243」這樣的點分十進位制,需要轉化成四位元組

25 if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)//繫結本地的埠號local

26

30 while(1)//不斷的對外提供服務

31

42 }

43 return 0;

44 }

客戶端:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 //三個命令列引數 可執行檔案 伺服器ip 伺服器端口號

10 int main(int argc,char*argv)

11 17 int sock=socket(af_inet,sock_dgram,0);

18 if(sock==-1)

19

23 //客戶端可以繫結,但是不需要繫結,伺服器段必須繫結,因為i伺服器必須是眾所周知切不可變的

24 while(1)

25

40 41 }

42 return 0;

43 }

UDP程式設計

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...

UDP程式設計

通訊流程 客戶端實現 from socket import sc socket af inet,sock dgram addr 127.0.0.1 8989 while true datastr input 輸入傳送內容 if datastr.eq exit break dataencode dat...

UDP程式設計

udp程式設計依靠的協議是udp協議,這種程式設計方式是不可靠的資訊傳輸方式,比如通話這類,是允許資訊丟失的。udp採用報文的方式收發資訊而不採用流的方式,每次傳送的報文大小也是有限制的,不能超過64k。固定的 結構 接收方 public class receiver catch socketexc...