socket編程是網路通信程式的撰寫,涉及到應用層以下各層協議的選擇,在傳輸層中我們主要了解TCP、UDP兩種協議:
TCP:傳輸控制協議,面向連接,面向位元組流,是一種可靠的傳輸通信協議,安全性較高,常用于檔案的傳輸,
UDP:用戶資料報協議,無連接,面向資料報,是一種不可靠的傳輸通信協議,實時速度高,常用于視頻/音頻的資料傳輸,
想使用套接字socket介面來進行UDP網路通信程式的撰寫,首先要了解C/S(客戶端/服務端)架構,客戶端是主動發起請求的一方,服務端是被動接受請求的一方,
服務端實作的流程:
1.創建套接字,在內核中創建socket結構體
2.為套接字系結地址資訊,給內核中創建的socket結構體中添加IP、PORT資訊等,這一步的目的是為了告訴作業系統哪些資料應該放到這個socket緩沖區中交給哪個行程處理
3.接收資訊,從對應的socket結構體的接受緩沖區中取出資料
4.回復資訊,通過接受資訊時獲取的發送端資訊進行資料回復
5.關閉套接字,釋放資源
客戶端實作的流程:
1.創建套接字,使行程與網卡之間建立聯系
2.為套接字系結地址資訊:每條資料中都有源端地址和對端地址,系結的地址就是源端地址資訊(客戶端不建議主動系結)
3.發送資料(如果沒有系結地址,作業系統會選擇合適的埠進行系結)
4.接收資料
5.關閉套接字,釋放資源
在對于服務端/客戶端實作的流程有了認識后,下面就是使用具體的介面實作各項功能:
在使用套接字時要添加頭檔案 #include<sys/socket.h>
1.創建套接字
int socket(int domain,int type,int protocol);
//domain是地址域型別 IPV4是 AF_INET IPV6是AF_INET6
//type是套接字型別 SOCK_STREAM位元組流服務 SOCK_DGRAM資料包服務
//protocol是協議型別 0是默認型別
//位元組流服務默認是TCP協議
//資料報服務默認是UDP協議
創建成功回傳一個非負整數(套接字描述符)
創建失敗回傳-1
2.為套接字系結資訊
int bind(int sockfd,const struct sockaddr*addr,socklen_t addrlen);
//sockfd 創建套接字回傳的操作句柄
//addr 不同的地址域有不同的地址結構
// addrlen 實際地址空間結構長度
成功回傳0
失敗回傳-1
3.發送資料
ssize_t sendto(int fd,void* buf,size_t len,int flags,struct sockaddr*addr,socklen_t addrlen);
//fd套接字操作句柄
//buf要發送的資料空間首地址
//len 要發送的資料長度(位元組)
//flags標志位 默認0 阻塞發送
//addr 對端地址資訊
發送資料成功回傳實際發送的資料位元組長度
失敗回傳-1
4.接收資料
ssize_t recvfrom(int sockfd,void*buf,size_t len,int flags,struct sockaddr*src_addr,socklen_t*addrlen);
//sockfd 創建套接字回傳的操作句柄
//buf 接識訓沖區空間首地址
//len 要接收的資料長度(不能大于緩沖區長度)
//flags 標志位 默認0 阻塞接收
//src_addr 發送端的地址資訊
//addrlen 輸入輸出引數 指定想要的地址長度 回傳實際的地址長度
成功回傳實際接收的資料長度
失敗回傳-1
5.關閉套接字
int close(fd);
除了以上五個介面以外,我們還需要了解地址轉換介面:
htons/htonl:主機位元組序到網路位元組序的整數轉換
ntohs/ntohl:網路位元組序到主機位元組序的整數轉換
點分十進制字串IP到網路位元組序整數IP地址的轉換:
int_addr_t inet_addr(const char*cp);// IPV4
int inet_pton(int af,const char*src,void*dst);// IPV4/IPV6
//af是地址域型別
//src是字串IP地址
//dst是回傳的轉換后的整數地址
網路位元組序整數IP地址到點分十進制字串IP地址的轉換:
char*inet_ntoa(struct in_addr in); // IPV4
const char*inet_ntop(int af,const void* src,char*dst,socklen_t size); //IPV4/IPV6
//af是地址域型別
//src是網路位元組序整數IP
//dst是回傳的轉換后的字串
//size 是dst的空間長度
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/273765.html
標籤:其他
上一篇:【每日藍橋】56、一八年省賽Java組真題“快速排序”
下一篇:面試記錄貼
