2、socket地址
根據前面的分析,我們可以認為soket句柄和本地的綁定地址共同確定了協議 棧上的數據接收緩沖區或者read緩沖區。而協議棧上的寫緩沖區或者發送是被公 用的(但是不同的協議無法公用,例如tcp和udp)。所以,對同一個地址,不同 的socket可以收到不同的內容。但是對一個socket上的地址綁扎,無論是顯式還 是隱式,只能進行一次。
3、並發連接
如果客戶端掉用connect進行連接請求,多個客戶端可能存在並發請求。服務 器會把不能響應的請求緩存在listen()指定了大小的請求隊列。這個時候被緩 存了請求的客戶端connect()方法會正確返回,並繼續執行。但是會在 send和 recv方法上被阻塞等待。
如果並發數目大於連接請求的緩沖區大小,那麼不能被緩存的那些連接 connect()方法會返回(暫不清楚有沒有返回錯誤)。但是在這個socket上調 用send或者recv方法,就會返回錯誤結果。
所以,如果連接請求的服務過程比較費時間,那麼為了不至於被緩存請求的 客戶端長時間等待和另一些客戶端連接失敗,一般需要采用多線程方式。因為把 服務交給子線程以後,主線程總有機會accept更多的請求。所以,除了把請求隊 列設置大一些,多線程也是改善服務的方法。
4、connect()
connect()有一個作用,從面向連接的例子看就是把一個數據發送或者寫入 地址幫頂到套接字上,從而使得該套接字綁定了兩個地址。顯式綁扎發送地址和 隱式綁扎接收地址。
無連接的協議也可以調用connect(),但是這種情況下connect()並不會 向服務器進行連接請求。這個時候就是把一個地址顯示綁扎到某個套接字,使它 具備一個關聯的數據發送地址。這樣,無連接協議也可以使用send()和recv( )在這樣一個套接字上寫如和讀取數據。雖然已經綁扎了一個默認的發送地址, 但是通過sendto()又可以把數據發送到非默認的地址。
bind()用來顯式給一個socket綁扎一個數據讀取地址,這是本地地址。客 戶端不鼓勵這種方式,而是采用隱式綁扎。但是如果顯式綁扎了也不會錯。