1. 程式人生 > >iOS總結-Socket的分析(二)之什麼是Socket?

iOS總結-Socket的分析(二)之什麼是Socket?

對於Socket,我也是自己慢慢學習,參考大神文章https://www.jianshu.com/p/2dbb360886a8
https://blog.csdn.net/yeyuangen/article/details/6799575
什麼是Socket? 
socket引入是為了解決不同計算機間程序間通訊問題
socket與程序間的關係: socket用來讓一個程序和其他的程序互相資訊,而Socket介面是TCP/IP網路的API介面函式
socket與檔案的關係: socket是種特殊的I/O
1.Socket最先應用於Unix系統
2.可對其進行檔案操作
3.有檔案描述符 檔案描述符的本質是一個非負整數.
Socket是網路上執行的兩個程式間雙向通訊的一端,既可以接受請求,也可以傳送請求,利用它可以較為方便的編寫網路上資料的傳輸.
現在server與client想建立連線, server近知道client的IP,埠號不知道,能建立連線嗎?
C和S是相對而言的,發起方是C,監聽埠接受連線方式是server,client如果不知道server監聽的埠,怎麼發起連線
每個網路通訊迴圈地進出主計算機的TCP,應用層,它被兩個所連線的號碼唯一地識別.這兩個號碼合起來叫做套接字,組成套接字的兩個號碼就是機器的IP 地址 和TCP 權健所使用的埠號.
通過socket()函式可以建立一個套接字,然後再把它繫結到埠號.
一個socket控制代碼代表兩個地址對 本地ip:port -- 遠端ip:port
socket的概念到底到哪裡為止?如利用socket()可以產生一個套接字控制代碼,可是在bind() 或connect() 之前它只是一個文字描述符.
如果說socket代表一個兩個地址對,那麼控制代碼的作用是不是僅僅是在bind() 或 connect() 之後的用於區分和標記這樣的地址對?因為這樣它才能和網路的概念連線起來.這樣,socket的意義應該是說用檔案描述符描述的通訊雙方的IP地址和埠號地址對.
答: socket為核心物件,由作業系統核心來維護其緩衝區,引用計數,並且可以在多個程序中使用.​​​​​​至於稱為控制代碼/檔案描述符都是一樣的,它只不過是核心開放給使用者程序使用的整數而已.
對於控制代碼  ip   port 的關係:
      1. 每個socket 本質上都是指一個ip地址和埠對
      2.為了操作這樣的地址對,使用了檔案描述符
      3.socket() 函式只建立了一個普通的檔案描述符,在進行bind() 或connect() 之前並不能說建立了用於網路通訊的套接字
      4.只有在進行了bind() 或 connect() 之後socket才被創立起來
       socket() 建立了一個socket核心物件, accept() 或 connect後, 才可以對socket控制代碼讀寫. 因為只有在 connect 或 bind,listen,accept後才會設定好socket核心物件裡邊的ip 和埠
     socket 和埠理解
     一個socket控制代碼代表兩個地址對"本地ip: port " -- "遠端ip:port"
    在windows下叫控制代碼, 在linux 下叫檔案描述符
    socket建立連線的過程大致分為:
     1. 建立socket套接字
     2.給套接字賦予地址, 這個地址不是通常的網路地址的概念
     3.建立socket連線
     建立socket套接字時, 實際上是建立了一個數據結構.好像我們獲得了一個像檔案描述符那樣的套接字描述符,就像我們隊檔案進行操作那樣,我們可以通過向套接字裡面寫資料將資料傳送到我們制定的地方,可以是遠端的主機, 也可以是本地的主機.
依照建立套接字的目的不同,賦予套接字地址的方式有兩種: 服務端使用bind , 客戶端使用connect
Bind:  只要使用ip , port 就可以區分一個tcp/ip連線(如果要區分特定的主機間的連線, 還需要第三個屬性hostname), 我們用bind函式來為一個使用在伺服器端中的套接字賦予通訊的地址和埠, 將通訊的ip地址和埠合起來構成了一個socket地址, 而制定一個socket使用特定的ip和port來進行通訊的過程就是賦予這個socket一個地址
 一個特定socket的地址生命期是bind成功以後到連線斷開前.
connect: 對於客戶端來說, 不使用bind , 它們通過connect函式來建立socket和socket地址之間的關係. 其中socket地址是想要連線的伺服器端的socket地址. 在connect建立socket 和 socket地址兩種關係的同時,它在嘗試著建立遠端的連線.
建立socket連線:   準備建立一個連線,服務端要2個步驟: bind 和 listen ; 客戶端: connect 
                              如果伺服器端accept一個connect, 而客戶端得到了這個accept的確認, 那麼一個連線就建立了