流式套接字(stream socket)是面向連線的套接字,採用tcp協議
**中用sock_stream表示,有幾大特徵
1、資料在傳輸過程中不會消失;
2、資料是按順序傳送與到達;
3、資料的傳送與接收不一定同步
解釋一下特徵3:客戶端和服務端都有乙個緩衝區,達到緩衝區的資料不一定被立即讀取,緩衝區滿了之後接收端也可以選擇一次性讀取或者分批次讀取。
典型應用:瀏覽器http協議
資料報套接字(datagram socket)是無連線的套接字,採用udp協議
**中用sock_dgram表示,有幾大特徵:
1、強調傳輸速度而非傳輸順序;
2、資料傳輸過程中可能丟失、損毀;
3、限制每次傳輸的大小;
4、資料的傳送和接受是同步的;
大部分套介面函式都需要乙個指向套介面位址結構的指標作為引數,每個協議族都定義了它自己的套介面位址結構,都以「sockaddr_」開頭。
ipv4套介面位址結構
網際套介面位址結構,以「sockaddr_in」命名,定義在標頭檔案中。
struc in_addr {
in_addr_t s_addr; //32bit ipv4 address, network byte ordered
struct sockaddr_in {
uint8_t sin_len; //length of structure(16)
sa_family_t sin_family; //af_inet
in_port_t sin_port; //16bit tcp/udp port number
struct in_addr sin_addr; //32bit ipv4 address
char sin_zero[8]; //unused
通用套介面位址結構
當作為引數傳遞給任乙個套介面函式時,套介面位址結構總是通過指標來傳遞,但通過指標來取得此引數的套介面函式必須處理來自所支援的任何協議族的套介面位址結構。
有乙個問題是如何宣告所傳指標的資料型別。ansi c中有很簡單的解決辦法,它有通用的指標型別void*,但是,套介面函式是在ansi c之前定義的,2023年採用了這樣乙個辦法:在標頭檔案中定義乙個通用的套介面位址結構
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
於是,套介面函式被定義為採用指向通用套介面位址結構的指標,要求這些函式的呼叫都必須將指向特定協議的調節扣位址結構的指標型別轉換成指向通用套介面位址結構的指標;
再說說bind和accept函式中最後乙個引數的差別
很顯然差別在於傳遞的是值還是結果,即bind函式中傳遞只是該指標的大小,而accept函式傳遞的是指標的位址,也就是可以取得該指標;原因在於bind函式在將套介面位址結構傳遞給套介面函式的方向是從程序到核心,核心僅需知道指標大小,使得核心在寫此結構時不會越界即可;而accept函式傳遞的 方向是從核心到程序,程序需要知道核心在此結構中確切儲存了多少資訊。
作用跟c的下列函式相同,只是操縱物件從字串變成位元組
linux下socket程式設計
一 什麼是socket socket可以看成是使用者程序與核心網路協議棧的程式設計介面。socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機的程序間通訊。socket api是一層抽象的網路程式設計介面,適用於各種底層網路協議,如ipv4 ipv6。struct sockaddr in...
linux下socket程式設計
作為乙個嵌入式開發者,在實際的研發專案中,常常需要編寫socket網路程式設計介面,提供給軟體開發人員。下面將提供乙個常用的 模板 客戶端的功能可以用微控制器多功能除錯助手進行驗證 include include include include include include include def...
linux下socket程式設計
簡單的linux下socket程式設計,分別基於tcp和udp協議實現的簡單程式 linux下socket程式設計可以概括為以下幾個函式的運用 流程 將套接字繫結到伺服器的網路位址上 if bind server sockfd,struct sockaddr my addr,sizeof struc...