套接字(socket)
什麼是套接字
套接字是一種通訊機制
通過套接字,可實現本機內的通訊、也可以實現跨網路的通訊。
使用套接字實現本地通訊(本機內的伺服器和客戶端)
例項:server1.c
client1.c
檔案系統套接字伺服器客戶端開發步驟
檔案系統套接字,用於本機內通訊
1) 伺服器端
(1) 刪除以前的檔案系統套接字所對應的檔案
(2) 建立乙個檔案系統套接字
(3) 設定伺服器位址
(4) 繫結該套接字,使得該套接字和對應的系統套接字檔案關聯起來。
(5) 建立套接字佇列, 儲存進入該伺服器的客戶端請求
(6) 迴圈處理客戶端請求
使用accept等待並接收客戶端請求
收到客戶端請求後,accept返回乙個新的socket(表示該客戶端連線)
使用這個新的socket,對客戶端進行「讀寫「
處理完畢後,關閉這個新的socket
2) 客戶端
(1) 建立乙個套接字
(2) 設定伺服器位址
(3) 使用該socket和伺服器位址連線伺服器(connect)
(4) 使用該socket傳送和接受資料。
(5) 關閉該socket
相關系統呼叫
1)建立套接字
socket
原型:int socket(int domain, int type, int protocol);
引數:domain, 表示套接字的域,相當於套接字的型別
常用的域有:af_unix , 檔案系統套接字,用於在本機的檔案系統內通訊
af_inet, unix網路套接字,用於網路通訊。
type, 表示該套接字的特性
檔案系統套接字,一般使用sock_stream
unix網路套接字,可使用:
sock_stream, 使用tcp通訊
sock_dgram, 使用udp通訊
補充:sock_stream, 是有序、可靠、面向連線的通訊, 對於unix網路套接字,通過tcp實現
sock_dgram, 即資料報服務,不保證按序到達, 對於unix網路套接字,通過udp實現
protocol,具體使用的協議。
一般取0,即表示使用預設的協議。
struct sockaddr_un
unix網路套接字:
struct sockaddr_in
補充:
struct in_addr
所以需要進行型別轉換,否則將出現警告。
2)繫結套接字
對於檔案系統套接字,繫結該套接字後,
使得該套接字和對應的系統套接字檔案關聯起來
對於unix網路套接字,繫結該套接字後,使得該套接字和乙個埠號關聯起來
bind
原型:int bind (int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
返回值:成功,返回0
失敗,返回-1
如果在當前路徑無相關許可權,則可能導致bind失敗。
解決辦法:指定乙個具有許可權的路徑即可,比如/tmp/...
3) 建立套接字佇列
listen
原型:int listen (int sockfd, int backlog);
功能: 建立乙個佇列,用來儲存訪問該伺服器套接字的請求。
引數2表示同時最多能接受多少個客戶端 請求,一般取5,即該佇列中最多可排5個請求。
返回值:成功,返回0
失敗, 返回-1
4)接受客戶端請求
accept
原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待並接受客戶端的請求。
如果沒有客戶端發起請求,則阻塞。
如果已有多個請求,則在該套接字的佇列中取出第乙個請求。
引數:sockfd, 伺服器套接字。
addr, 所接收到的客戶端位址
返回值:成功,則返回乙個新的套接字,以表示與該客戶端的連線。
直接使用該套接字,就可以對客戶端進行讀寫。
失敗:返回-1
5)向伺服器傳送連線請求
connect
原型:int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
引數:sockfd, 表示連線伺服器的套接字
serv_addr, 伺服器的位址
addrlen, 伺服器位址的長度
返回值:成功, 0
失敗, -1
6) 關閉套接字
close(socket_fd);
關閉對應的連線。
// 補充:
當客戶端關閉後,
伺服器端可以對該客戶端進行讀read,不阻塞返回0
但不能對該客戶端進行write操作,否則異常退出
檔案系統 why檔案系統
為什麼需要檔案系統,可否由作業系統直接寫裸裝置?裸裝置是一種沒有經過格式化的磁碟或分割槽,即讓作業系統直接管理操作磁碟設定,進行資料讀寫等。通過檔案系統的方式組織磁碟儲存和資料管理有很多好處,比如 1.資料讀取 管理等操作變得簡單便捷 檔案系統給使用者提供了乙個簡單的操作介面,只需簡單的操作就能實現...
檔案系統 檔案系統的架構
vfs是具體檔案系統的抽象,依靠超級塊 inode dentry以及檔案這些結構來發揮作用,檔案系統的架構就體現在這些結構的使用方式中。1 超級塊作用分析 1 2 所有的dentry都指向乙個dentry hashtable dentry hashtable是乙個樹組,每乙個樹組成員都是hash鍊錶...
檔案系統 編寫檔案系統
8.5 編寫乙個檔案系統 如果寫乙個實際檔案系統,但是涉及的東西太多,不容易簡明扼要的理解檔案系統的實現。linux核心中提供的romfs檔案系統是個非常理想的例子,既有實際應用架構,也清晰明了,故以romfs為例項分析檔案系統的實現。一 linux檔案系統的實現要素 編寫新檔案系統涉及一些基本物件...