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

socket編程與線程模型三

編輯:關於.NET

2、socket詳解socket是一種特殊的I/O,所以socket類似於文件指針、文件 句柄。通過socket可以寫入和讀取數據。

socket原理圖

socket這種I/O的特殊性在於創建了一個socket以後並不能馬上進行數據讀取 或者寫入操作。它必須和一定的地址聯系起來才可以操作。從無連接的協議看看 這個過程。

sendto(),首先執行sendto()的一方必須要知道對方的地址,才能 sendto(),也就是把數據寫入一個socket。

無連接的socket

首先是數據的接受方創建一個socket,然後把一個地址SockAddr1與這個特殊 的I/O綁定。然後就可以從這個socket進行數據讀取:recvfrom()。這個一般 是服務器方。

然後是客戶端方面,它顯然必須知道服務器端的SockAddr1這個地址才能寫入 數據。所以,它創建一個特殊的I/O --- socket,然後就進行數據寫入:sendto ()。這個時候sendto除了向指定的地址寫入數據,還要隱式的給這個socket綁 定一個本地地址:SockAddr2。

服務方通過recvfrom()除了讀取到客戶提供的數據以外,還可以通過出口 參數獲得發送者的地址。它使用sendto(),通過任何一個socket(用socket2 或者新建一個,新建是浪費資源,就用socket2就可以了)向客戶端回寫一些數 據。

上述情況時客戶端給新建的socket通過sendto()隱式綁定地址,這個地址 是系統隨機生成的。客戶端也可以在sendto()之前采用bind()顯式綁定一個 地址,然後sendto()就會采用這個顯式綁定的地址作為源地址,但是不鼓勵這 麼做。

總結:socket是一種特殊的I/O,通過這種I/O可以讀寫數據。Socket在使用 的時候需要綁定一個地址,這個被綁定的地址就是應用程序用來讀取的地址,也 就是接收數據的地址。而應用程序寫入數據的地址,也就是發送數據的地址並不 是和socket需要綁定的,這個地址可以隨意變換。所以,在無連接情況下,通過 同一個socket可以向多個地址寫入數據,但是讀取數據的地址只有一個,那就是 給這個socket綁定的地址。

無連接多點通信

上圖所示的例子我們可以認為上方為服務器。服務器創建soctet1,然後與地 址SockAddr2顯式綁扎。所以,SockAddr2就是服務器從socket1讀取數據的地址 ,只有一個讀取地址。

然後,3個客戶端知道服務器地址SockAddr2,它們向服務器寫入數據, sendto()。然後,服務器通過recvfrom()獲取數據,並且獲知三個客戶端的 綁扎地址(隱式或者顯式都可以)。服務器通過三個客戶端的地址,通過同一個 socket--- socket1,向三個客戶端分別寫入數據。客戶端通過recvfrom()得 到服務器數據。

對於一個socket,只能進行一次地址綁扎,即一次bind()。假如把上圖認 為是一個客戶端向三個服務器首先進行sendto()寫入數據,客戶端並沒有顯式 綁扎SockAddr2地址,那麼客戶端第一次調用sendto()的時候就會進行隱式綁 扎,以後就不會。第一次綁扎分配的SockAddr2不會再改變,三個服務器通過 recvfrom()獲取到的源地址都是SockAddr2。

廣播:從以上原理,可以知道無連接協議的廣播是socket的發送地址的一個 特例,而與綁定地址和函數沒有關系。只要設置sendto()的目的地址SockAddr 為廣播類型就可以了。

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