一、主要目的
提出对交换机软件控制逻辑的猜测。
二、交换机控制软件的组成
(一)背景
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、发现通信状态发生改变,只能是不断定时循环判断。