socket程式設計基礎知識

2021-07-02 02:06:54 字數 4495 閱讀 4963

為了使網路上的計算機能夠彼此識別對方,每台計算機都需要乙個ip位址以標識自己。ip位址由ip協議規定,以32位的二進位制數示。最新的ipv6協議將ip位址公升為128位,這使得ip位址更加廣泛,能夠很好地解決目前ip位址緊缺的情況,但是ipv6協議距離實際應用還有一段距離,目前多數作業系統和應用軟體都是以32位的ip位址為基準。32位的ip位址主要分為兩部分,即字首和字尾。字首表示計算機所屬的物理網路,字尾確定該網路上的唯一一台計算機。在網際網路中,每乙個物理網路都有乙個唯一的網路號。根據網路號的不同,可以將ip位址分為5類,即a類、b類、c類、d類和e類。其中,a類、b類和c類屬於基本類;d類用於多播傳送;e類屬於保留。

雖然使用ip位址可以標識網路中的計算機,但是ip位址容易混淆,並且不容易記憶,人們更傾向於使用主機名來標識ip位址。由於在internet上存在許許多多的計算機,為了防止主機名相同, internet管理機構採取了在主機名後加上字尾名的方法標識一台主機,其字尾名被稱為網域名稱。例如,www.mingrisoft.com,主機名為www,網域名稱為mingrisoft.com。這裡的網域名稱為2級網域名稱, com為一級網域名稱,表示商業組織;mingrisoft為二級網域名稱,表示本地名。為了能夠利用網域名稱進行不同主機間的通訊,需要將網域名稱解析為ip位址,稱之為網域名稱解析。網域名稱解析是通過網域名稱伺服器來完成的。假如主機a的本地網域名稱伺服器是dns.local.com,根網域名稱伺服器是dns.mr.com;所要訪問的主機b的網域名稱為www.mingribook.com,網域名稱伺服器為dns.mrbook.com。當主機a通過網域名稱www.mingribook.com訪問主機b時,將傳送解析網域名稱www.mingribook.com的報文;本地的網域名稱伺服器收到請求後,查詢本地快取,假設沒有該記錄,則本地網域名稱伺服器dns.local.com向根網域名稱伺服器dns.mr.com發出解析網域名稱www.mingribook.com的請求;根網域名稱伺服器dns.mr.com收到請求後查詢本地記錄,如果發現「mingribook.com ns dns.mrbook.com」資訊,將給出dns.mrbook.com的ip位址,並將結果返回給主機a的本地網域名稱伺服器dns.local.com;當本地網域名稱伺服器dns.local.com收到資訊後,會向主機b的網域名稱伺服器dns.mrbook.com傳送解析網域名稱www.mingribook.com的報文;當網域名稱伺服器dns.mrbook.com收到請求後,開始查詢本地的記錄, 發現「 www.mingribook.com a 211.120.x.x 」 其 中 「 211.120.x.x 」 表示網域名稱www.mingribook.com的ip位址,類似的資訊,將結果返回給主機a的本地網域名稱伺服器dns.local.com。

所謂位址解析是指將計算機的協議位址解析為實體地址,即mac位址,又稱為**裝置位址。通常,在網路上由位址解析協議arp來實現位址解析。下面以本地網路上的兩台計算機通訊為例介紹arp協議解析位址的過程。

假設主機a和主機b處於同乙個物理網路上,主機a的ip為192.168.1.21,主機b的ip為192.168.1.23,當主機a與主機b進行通訊時,主機b的ip位址192.168.1.23將按如下步驟被解析為實體地址。

(1)主機a從本地arp快取中查詢ip為192.168.1.23對應的實體地址。使用者可以在命令視窗中輸入「arp -a」命令檢視arp快取

(2)如果主機a在arp快取中沒有發現192.168.1.23對映的實體地址,將傳送arp請求幀到本地網路上的所有主機,在arp請求幀           中包含了主機a的實體地址和ip位址。

(3)本地網路上的其他主機接收到arp請求幀後,將檢查是否與自己的ip位址匹配。如果不匹配,則丟棄arp請求幀。如果主機b           發現與自己的ip位址匹配,則將主機a的實體地址和ip位址新增到自己的arp快取中,然後主機b將自己的實體地址和ip位址發         送到主機a,當主機a接收到主機b發來的資訊時,將以這些資訊更新arp快取。

(4)當主機b的實體地址確定後,主機a就可以與主機b通訊了。

在網路上,計算機是通過ip位址來彼此標識自己的,但是當涉及兩台計算機之間的具體通訊時,還會出現乙個問題——如果主機a中的應用程式a1想與主機b中的應用程式b1通訊,如何知道主機a中是a1應用程式與主機b中的應用程式通訊,而不是主機a中的其他應用程式與主機b中的應用程式通訊?反之,當主機b接收到資料時,又如何知道資料是發往應用程式b1的呢(因為在主機b中可以同時執行多個應用程式)?

為了解決上述問題,tcp/ip協議提出了埠的概念,用於標識通訊的應用程式。當應用程式(嚴格說應該是程序)與某個埠繫結後,系統會將收到的給該埠的資料送往該應用程式。埠是用乙個16位的無符號整數值來表示的,範圍為0~65535。低於256的埠被作為系統的保留埠,用於系統程序的通訊;不在這一範圍的埠號被稱為自由埠,可以由程序自由使用。

server端

using system;

using system.collections.generic;

using system.text;

using system.net;

using system.net.sockets;

namespace socketserver

; //send方法返回傳送的位元組數

console.writeline("總計將傳送" + client.send(msg) + "個位元組的資料");

console.writeline("結束.");

// console.readline();

client.close();

break;} }

}}

}

client端

using system;

using system.collections.generic;

using system.text;

using system.net;

using system.net.sockets;

namespace socketclient

server.send(encoding.ascii.getbytes(input));

}console.writeline("連線斷開...");

server.shutdown(socketshutdown.both);

server.close();}}

}}

多執行緒版

server端

using system;

using system.collections.generic;

using system.text;

using system.net;

using system.net.sockets; //可以使用套接字

using system.threading; //可以使用多執行緒

namespace threadtcpclient

}static void main(string args)

}class clientthread

public void clientservice()

console.writeline("新客戶連線建立: 個連線數", connections);

while ((i = service.receive(bytes)) != 0)

", data);

// 處理客戶端發來的訊息,這裡是轉化為大寫字母

//data = data.toupper();

byte msg = encoding.utf8.getbytes("message from server");

// 傳送一條應答訊息

service.send(msg);

console.writeline("傳送的資料: ", "message from server");

}//關閉套接字

service.close();

connections--;

console.writeline("客戶關閉連線: 個連線數", connections);}}

}

client端

using system;

using system.collections.generic;

using system.text;

using system.net;

using system.net.sockets;

namespace threadtcpclient

catch (socketexception)

while (true)

client.send(encoding.utf8.getbytes(input));

//得到實際收到的位元組總數

int rec = client.receive(buf);

console.writeline(encoding.utf8.getstring(buf, 0, rec));

}console.writeline("斷開與伺服器的連線......");

client.close();}}

}

socket通訊原理

Socket程式設計 基礎知識

一 計算機通訊的必備條件 ip 埠 區分不同的應用程式 埠範圍是0 65535,1 1023被系統保留 協議二 tcp ip 傳輸控制協議 網際網路協議 模型 應用層 http 超文字傳輸協議 瀏覽網頁,80 ftp 簡單郵件傳送協議 telnet 遠端登路服務 23 傳輸層 tcp ip協議 網路...

socket 基礎知識

socket是使用 標準unix 檔案描述符 file descriptor 和其它程式通訊的方式。struct sockaddr.這個結構 為許多態別的套接字儲存套接字位址資訊 struct sockaddr sa family 能夠是各種各樣的型別,但是在這篇文章中都是 af inet sa d...

socket基礎知識

注意 如果你已經接觸過socket,那就沒什麼必要耽誤時間看下去了。另外,如果發現其中任何錯誤,歡迎直接指出。1.按慣例先來介紹下socket windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符 在unix中一切都是以檔案為單...