天天看點

Linux Socket

參考自:https://blog.csdn.net/kunkliu/article/details/80848138

socket()函數介紹

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

socket()打開一個網絡通訊端口,如果成功的話,就像open()一樣傳回一個檔案描述符,應用程式可以像讀寫檔案一樣用read/write在網絡上收發資料,如果socket()調用出錯則傳回-1。對于IPv4,family參數指定為AF_INET。對于TCP協定,type參數指定為SOCK_STREAM,表示面向流的傳輸協定。如果是UDP協定,則type參數指定SOCK_DGRAM,表示面向資料報的傳輸協定。protocol參數的介紹從略,指定為0即可。

bind()函數介紹

#include <sys/socket.h>

int bind(int socket, const struct sockaddr *address, socklen_t address_len);      

将address指向的sockaddr結構體中描述的一些屬性(IP位址、端口号、位址簇)與socket套接字綁定,也叫給套接字命名。

調用bind()後,就為socket套接字關聯了一個相應的位址與端口号,即發送到位址值該端口的資料可通過socket讀取和使用。當然也可通過該socket發送資料到指定目的。

對于Server,bind()一般在實際工程中是需要的,伺服器啟動時需要綁定指定的端口來提供服務(以便于客戶向指定的端口發送請求),對于伺服器socket綁定位址,一般而言将IP位址指派為INADDR_ANY(該宏值為0),即無論發送到系統中的哪個IP位址(當伺服器有多張網卡時會有多個IP位址)的請求都采用該socket來處理,而無需指定固定IP。

對于Client,一般而言無需主動調用bind(),一切由作業系統來完成。在發送資料前,作業系統會為套接字随機配置設定一個可用的端口,同時将該套接字和本地位址資訊綁定。

注意:

用戶端不是不允許調用bind(),隻是沒有必要調用bind()固定一個端口号。

伺服器也不是必須調用bind(),但如果伺服器不調用bind(),核心會自動給伺服器配置設定監聽端口,每次啟動伺服器時端口号都不一樣,用戶端要連接配接伺服器就會遇到麻煩。

connect函數介紹

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
      

用戶端需要調用connect()連接配接伺服器,connect和bind的參數形式一緻,差別在于bind的參數是自己的位址,而connect的參數是對方的位址。connect()成功傳回0,出錯傳回-1。

.

/************* 社會的有色眼光是:博士生、研究所學生、大學生、工廠中的房間勞工; 重點大學高材生、普通院校、二流院校、野雞大學; 年薪百萬、五十萬、五萬; 這些都隻是帽子,可以失敗千百次,但我和社會都覺得,人隻要成功一次,就能換一頂帽子,隻是社會看不見你之前的失敗的帽子。 當然,換帽子決不是最終目的,走好自己的路就行。 杭州.大話西遊 *******/