抽時間學習了Linux的網絡編程,以前只是對socket有個字面上的了解,具體的機制和用法一無所知。正好項目要用,學習下,做個筆記。
在Linux上,任何都可以當做文件來對待。獲得一個文件描述符,就可以對它進行讀寫操作。socket也是一樣。
socket在Linux下被翻譯成套接字,我覺得這個翻譯真的很爛,第一次接觸的人不可能知道套接字是個什麼東西。翻譯成插座反而直觀明了,更容易理解。
socket是為c/s模型設計的,也就是客戶--服務器模型。解決了進程間通信的問題。
下面主要說的面向連接的socket,無連接的socket就不講了。
簡單的將,服務端起一個socket,監聽一個端口,等待客戶端的連接,然後客戶端起一個socket,指向服務端的ip地址,端口號,向服務器發起連接請求。連接成功後就可以發送信息。看一下簡單的流程
前面講了socket可以當做一個文件來讀寫。那麼讀寫文件一般都是要獲得一個文件描述符,socket通信要獲得一個socket描述符,也可以理解為特殊的文件描述符,叫法不同而已。
通過socket函數獲得socket描述符
int socket(int domain , int type , int protocol);
這個函數返回一個int型的值,就是socket描述符。如果發生錯誤則返回-1。
domain確定通信域,包括地址格式。通常被設為AF_INET代表IPv4因特網。
type確定socket類型,是無連接還是有鏈接的。
protocol通常設為0,表示按給定的域和socket類型選擇默認協議。比如domain為AF_INET,type為SCOK_STREAM時,默認協議就是TCP。
bind()函數綁定端口。 【Linux公社 http://www.linuxidc.com 】 聲明如下
int bind (int sockfd , const struct sockaddr *my_addr , int addrlen) ;
其中,sockfd就是socket函數返回的socket描述符;my_addr是一個指向struck sockaddr的指針,包含地址信息:名稱、端口和ip地址。
addrlen一般設為sizeof(struct sockaddr);
connect()函數連接服務器地址,聲明如下:
int connect (int sockfd, const struct sockaddr *serv_addr, int addrlen);
返回一個int型的值,連接成功返回0,出錯則返回-1;
參數sockfd還是socket描述符,此時是請求連接的socket。
serv_addr就是服務器地址。