一、主要目的
? ? 提出對交換機軟件控制邏輯的猜測。
?
二、交換機控制軟件的組成
? (一)背景
? ? ? 1、交換機有很多的RJ45水晶頭端口。
? ? ? 2、每個端口支持同時發送和接收字節數據。
? ? ? 3、每個端口接收的數據需要查表后才能轉發給目標端口。
?
? (二)端口狀態掃描線程
? ? ? ? 負責掃描每個端口的狀態,如果連接了雙絞線,就開啟對應的發送線程,接收線程;如果斷開連接,就通知線程關閉。
?
? 主要邏輯:
// 循環每個端口
for(int k = 0; k < len; k++){
? ? ?// 如果端口是建立了連接,并且沒有啟動接收和發送線程
? ? ? if(ports[k]是連通的? &&? ports[k]沒有啟動收發線程){
? ? ? ? ? ?// 啟動對應端口的發送線程
? ? ? ? ? ?start_send_thread(ports[k]);
?
? ? ? ? ? ?// 啟動對應端口的接收線程? ? ?
? ? ? ? ? ?start_recv_thread(ports[k]);
?
? ? ? ?} else if(ports[k]是斷開的? &&? ports[k]啟動了收發線程){
? ? ? ? ? ? // 停止對應端口的發送線程
? ? ? ? ? ?stop_send_thread(ports[k]);
?
? ? ? ? ? ?// 停止對應端口的接收線程? ? ?
? ? ? ? ? ?stop_recv_thread(ports[k]);
? ? ? ? }
}
?
? (三)每個端口的接收線程
? ? ? ? 接收端口的數據包,獲得目標RJ45端口號,發給目標端口號的數據發送隊列里。
while(退出為假){
? ? ? // 阻塞接收當前端口的字節數據
?
? ? ? // 獲取數據包中的目標MAC地址
?
? ? ? // 通過查表,獲取對應的水晶頭端口號
? ? ? if(端口號存在){
? ? ? ? ? ?// 獲得目標端口對應的發送線程的隊列
?
? ? ? ? ? // 把數據包入隊到目標端口發送線程的發送隊列里
? ? ? ?} else {
? ? ? ? ? ?// 丟棄該數據包
? ? ? ?}
}
?
? (四)每個端口的發送線程
? ? ? ? 從發送隊列里出隊數據包,發給和端口相連的設備。
while(退出為假){
? ? ? // 阻塞出隊一個數據包
? ? ? Data data = queue.deQueue();
?
? ? ?// 通過雙絞線發給相連的設備(另一臺交換機、路由器、電腦主機)
? ? ?pin.send(data);
}
? ? ?
?
三、總結
? ? 1、全雙工通信需要占用2根線路(發送和接收各自一根),需要開啟兩個線程。
?
? ? 2、多個線程執行同一個方法的時候要添加排他鎖。
?
? ? 3、發現通信狀態發生改變,只能是不斷定時循環判斷。
?