程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> socket編程與線程模型五

socket編程與線程模型五

編輯:關於.NET

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綁扎一個數據讀取地址,這是本地地址。客 戶端不鼓勵這種方式,而是采用隱式綁扎。但是如果顯式綁扎了也不會錯。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved