基於UDP TCP網路套接字程式設計

2021-09-24 20:32:55 字數 3441 閱讀 7803

傳輸層基於udp的網路通訊流程:

客戶端                                    服務端

1.建立套接字---返回套接字控制代碼   socket        1.建立套接字---返回套接字控制代碼

2.為套接字繫結位址和埠           bind            2.為套接字繫結位址和埠

3.傳送資料                                       sendto       3.開始接收資料

4.接收資料                                       recvfrom    4.恢復資料

5.關閉套接字                                    close         5.關閉套接字

客戶端我們不建議手動繫結位址,因為如果埠衝突,客戶端就會啟動失敗,但是

客戶端對埠並沒有硬規定;客戶端傳送資料,作業系統檢測到還沒繫結位址,則

會選擇合適的位址進行繫結

//1.建立套接字     

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

//domain:  位址域

//   af_inet   表示使用ipv4協議

// type: 套接字型別

//      sock_stream 流式套接字--預設協議tcp

//      sock_dgram  資料報套接字--預設協議udp

// protocol:

//    0    使用預設協議

//   ipproto_tcp  6   tcp協議

//   ipproto_udp  17  udp協議         

//返回值: 套接字操作控制代碼-檔案描述符   失敗:-1

//2.為套接字繫結位址資訊

//因為網路通訊使用網路位元組序,因此埠和ip位址資訊都需要被轉換

//成網路位元組序的資料

//uint16_t htons(uint16_t hostshort);

//將十六位色資料從主機位元組序轉換為網路位元組序

//uint32_t htonl(uint32_t hostshort)

//將32位的資料從主機位元組序轉換成網路位元組序

//int_addr_t inet_addr(const char* cp)

//將字串點分十進位制ip位址轉換位網路位元組序的整數ip位址

//bind(int sockfd,struct sockadd* addr,sock_len addrlen);

//sockfd:建立套接字返回的套接字描述符

//addr:要繫結的位址資訊

//addrlen:位址首席資訊官度

//返回值: 0     失敗:-1

bool recv(std::string& buf,sockaddr_in* _addr=null)//接收資料

//ssize_t recvfrom(int sockfd,void* buf,size_t len,

//int flags,struct sockaddr* src_addr,socklen_t* addrlen);

//sockfd:套接字描述符

//bf:    用於儲存接收鋪的資料

//len:   要接收資料的長度

//flags: 預設0--阻塞接收--沒有資料則阻塞

//src_addr: 傳送端的位址資訊

//addrlen:  輸入輸出型引數,用於獲取位址資訊的長度

//返回值:實際接收的資料長度    失敗:-1

bool send(std::string &buf, struct sockaddr_in &addr)//傳送資料

//ssize_t sendto(int sockfd, const void *buf, size_t len, 

//int flags,struct sockaddr *dest_addr, socklen_t addrlen);

//  dest_addr:  目的端位址資訊

//  addrlen:    位址首席資訊官度

./udp_srv  0.0.0.0 6666      監控當前主機所有傳送到6666埠的資訊

netstat -anptu     //檢視網路狀態

服務端監聽了什麼位址,客戶端傳送資料的時候目的端位址就必須是多少

(雲伺服器需要注意,服務端監聽應該是內網位址,但是客戶端要訪問公網位址)

服務端監聽0.0.0.0位址表示監聽當前計算機上所有網絡卡

(需要注意客戶端不能使用0.0.0.0位址)

mysql 埠:3306  8080

基於tcp協議的網路通訊客戶端服務端程式編寫

客戶端                           服務端

1.建立套接字                        1.建立套接字 

2.不推薦繫結位址資訊              2.繫結位址資訊

3.向服務端發起連線請求             3.開始監聽

int listen(int socket,int backlog)

告訴作業系統可以接收連線請求

建立連線的過程由作業系統完成

backlog:同一時間的客戶端最大併發連線數

客戶端一旦建立成功,服務端會單獨建立乙個socket

專門與指定客戶進行通訊

4.阻塞接收已完成連線客戶端資訊

newfd=accept(sockfd,srd_addr,len)

從已完成連線佇列中取出乙個socket

4.收發資料                              5.使用這個針對客戶端與新建的socket與客戶端進行通訊

recv(newfd,)

send()

5.關閉套接字                          6.關閉套接字

tcp在作業系統會進行保活檢測,如果連續好幾次保活檢測失敗,則認為連線斷開

sysctl  -a|grep keep     tcp具有自己的保活探測機制

在**中,若斷開連線/或對端關閉連線-->recv返回0;

send 會觸發異常--sigpipe-導致程序退出        

基本的tcp服務端程式只能同時只能與乙個客戶端進行通訊:因為服務端不知道    

客戶端資料什麼時候到來,因此服務端的程式流程只能寫死,而寫死可能導致

阻塞(accept/recv)    accept阻塞:新的客戶端一直沒來,就會阻塞

recv阻塞:客戶端沒有發資料就會一直阻塞

多程序tcp服務程式:乙個子程序處理乙個客戶端,實現多個客戶端同時處理

父程序必須關閉客戶端socket

多執行緒tcp服務程式:乙個子執行緒處理乙個客戶端,實現多個客戶端同時處理

主線程不能關閉socket;同時乙個程序中的執行緒共享檔案描述符表;    

網路套接字程式設計

1。位元組序 小位元組 低位儲存在低位元組 大位元組 低位儲存在高位元組 簡單程式判斷 int islittle 2.hostent結構 struct hostent define h addr h addr list 0 這裡是這個資料結構的詳細資料 struct hostent h name 位...

網路程式設計套接字

建立 函式原型 int socket int domain int type int protocol 引數說明 domain 協議域,又稱協議族 family 常用的協議族有af inet af inet6 af local 或稱af unix,unix域socket af route等。協議族決...

網路程式設計套接字

本節重點 本節重點需要掌握的是 基本概念 1.認識ip位址 同樣的問題,整個西天取經過程中,直到ip位址 從長安到西天 只知道這個不能完成取經 需要直到從長安的誰那得到的資訊到西天的誰那拿經 唐太宗 如來佛 有了ip位址 長安 西天 和埠號 唐太宗 如來佛 才能完成取經。引出了下面的埠號的概念。2....