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

socket編程與線程模型二

編輯:關於.NET

Winsock是windows系統上的一個網絡通信API編程接口。TCP/IP協議棧只是 winsock通信的一個子集,winsock還可以支持除了tcp/ip之外的其它協議棧。 BSD socket是unix上tcp/ip協議棧的編程接口,所以winsock和BSD套接字包含的 協議棧不一樣。所以winsock編程中對於需要榜定的地址必須說明協議族和地址 類型等。因為它可以支持很多通信協議。

winsock說明

圖中紫色的長方形代表數據緩沖區,網卡和協議棧都有緩沖區。數據到達以 後,首先在網卡的緩沖區。這個時候,通過網卡驅動數據被拷貝到數據所屬的協 議棧的緩沖區。最後,應用程序可以從協議棧的緩沖區把數據取走。當應用程序 發送數據,數據就會首先被緩存到協議棧的緩沖區,協議棧在適當的時候就會通 過網卡驅動把數據拷貝到網卡的緩沖區,最後數據就被網卡驅動發送到物理網絡 上。但是需要明確,網卡的數據緩沖區比協議棧的小的多。所以,協議棧的緩沖 區內容是不斷的積累網卡緩沖區內容的結果。

2、采用大緩沖區

Winsock API可以讓程序員設置整個協議棧緩沖區的大小。把這個緩沖區設置 的大一點可以接受更多的客戶同時發送數據,也可以支持暫時緩存應用程序發送 的數據。

也就是采用大緩沖區的時候,遠端的發送程序不會因為協議棧緩存滿而發送 失敗;本地的應用程序也不會因為緩存滿而發送失敗。或者在流式套接字的時候 是發送被阻塞。

3、采用重疊I/O

采用重疊I/O可以提高應用程序收發數據的效率。

如圖所示,采用重疊I/O以後數據就會直接從網卡的數據緩沖區拷貝到應用程 序的數據緩沖區,從而減少了協議棧的一個數據緩沖環節,消除了很多內存拷貝 操作。從而提高了應用程序的效率。

overlapped IO

四、無連接的winsock1、概述

網絡中可以用一個三元組全局唯一地標志一個進程,這個三元組的結構是: (協議、本地地址、本地端口號)。這個三元組叫做一個半相關。

一個完整的網間進程通信需要由兩個進程組成,並且只能使用同一種高層協 議(如tcp,udp)。就是說不可能一端用tcp,另一端用udp。因此,一個完整的 網間通信需要一個五元組來標識:(協議、本地地址、本地端口好、遠地地址、 遠地端口號)。這樣一個五元組叫做全相關。也就是同一個協議的兩個半相關才 能組成一個全相關,也就是一個連接。

無連接的socket

Bind()與是否面向連接有關。產生一個socket以後,Bind()把套接字與 本地的一個端口相關聯。也就是進程在系統中為自己的通信登記一個地址。這個 就類似於為一個服務指定一個電話號碼,例如114查詢服務或者一個客服熱線。 而創建一個socket的舉措類似於建立一個服務,但是沒有指定一個電話號碼之前 (Bind之前),客戶無法與之通信。Bind以後,服務方必須讓客戶知道這項服務 的號碼,也就是一個半相關(協議、本地地址、本地端口號)。

Bind()是顯式綁定,客戶端一般不一定要顯式綁定,例如通過connect() 、Sendto()等幾個方法可以附帶綁定,產生客戶端半相關。如果客戶端顯式綁 扎,那麼客戶端其實和一個服務端在概念上沒有區別了。在多點對等通信模型中 這一點很重要。

首先發送方知道對方的地址,通過sendto()發送數據;接收方通過 recvfrom()接收數據,通過這個函數的出口參數可以獲知發送方的地址,然後 就可以回送數據。所以客戶端沒有必要顯式bind()一個地址。服務器方之所以 需要bind()一下,是因為它首先調用recvfrom(),這個接口的參數要求一個 已經幫扎了本地地址的socket。如果客戶端也顯式綁扎一個地址,它就具備了端 到端的網絡通信的能力了。

無連接的socket二

如圖所示的無連接socket編程模型,其客戶端並沒有使用Bind()顯式提供 半相關。它是通過Sendto和recvfrom進行附帶綁扎。那麼服務端如何回送數據呢 ?recvfrom()提供了一個出口參數,用來返回源地址,通過這個源地址,服務 端可以回送數據到客戶端。

如圖所示的無連接socket編程模型,其客戶端並沒有使用Bind()顯式提供 半相關。它是通過Sendto和recvfrom進行附帶綁扎。那麼服務端如何回送數據呢 ?recvfrom()提供了一個出口參數,用來返回源地址,通過這個源地址,服務 端可以回送數據到客戶端。

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