📄 network.cpp
字号:
#include <stdio.h>
#include <windows.h>
#include <iostream.h>
#include <winbase.h>
HANDLE hSema; //定义交换路由信息的互斥信号量
HANDLE hCount; //用于修改计数器的互斥信号量
HANDLE hSend; //用于发送信息的互斥量
HANDLE hOutput; //定义显示输出时的互斥量
int Count=0; //交换信息的计数器
char lujing[20]; //记录路径序列
int counter; //路径的当前改写指针
char A[5];
//封装全局变量
class quanju{
public:
int tuopu[10][10]; //保存网络拓朴结构,定义对象时加入数据
char zhuji[10][5]; //保存路由器的主机信息,定义对象时加入数据
} quanjuliang;
//此类定义的对象名为quanjuliang
int graph[10][10]={
{0,1,1,1,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,1,0},
{1,0,0,0,0,0,1,0,1,0},
{1,0,0,0,1,1,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,1},
{0,0,1,0,0,0,0,1,0,1},
{0,0,0,0,0,0,1,0,1,1},
{0,1,1,0,0,0,0,1,0,0},
{0,0,0,0,0,1,1,1,1,0}
};
char zhj[10][5]={"AB","A","A","A","AB","A","AB","A","AB","A"};
class luyouqi{
public:
char mudi[10][3]; //[i][0]为目的点;[i][1]为到目的结点的出发点;[i][2]为记录跳数,
int tiaoshu[10];
char zhujibiao[10]; //记录路由器连接的主机信息
char lingju[10]; //记录邻居路由器号
char buffer[50]; //路由器的缓冲区
}thread[10]; //定义一个类数组 是不是10个路由器?????????????????????
void begin()
{
int m=0;
for(int i=0;i<10;i++) //初始化所有变量
for(int m=0;m<10;m++)
{
thread[i].tiaoshu[m]=0;
thread[i].mudi[m][0]=thread[i].mudi[m][1]=thread[i].mudi[m][2]=0;
thread[i].zhujibiao[m]=0;
thread[i].lingju[m]=0;
}//这个是路由器的类的初始化
for(i=0;i<10;i++)
thread[i].buffer[0]=0;//路由器的缓冲区全部清空
for(i=0;i<10;i++)
{
m=0;
for(int n=0;n<10;n++) //拷贝路由结点的邻居结点
if(quanjuliang.tuopu[i][n]==1)
{
thread[i].lingju[m]=n+65;
m++;
thread[i].mudi[n][1]=n+65; //初始化路由表的部分信息
thread[i].tiaoshu[n]=1;
}
thread[i].mudi[i][1]=i+65;
thread[i].tiaoshu[i]=0;
strcpy(thread[i].zhujibiao,quanjuliang.zhuji[i]); //拷贝路由结点所带的主机
}
for(i=0;i<10;i++)
for(m=0;m<10;m++) //初始化路由表其它信息
{
thread[i].mudi[m][0]=m+65;
if(thread[i].mudi[m][1]==0)
{
thread[i].mudi[m][1]='X';
thread[i].tiaoshu[m]=100;
}
}
return;
}
DWORD SubThread(void * pD)
{
int i=(int) pD;
int current=i;
int count;
loop:
count=Count;
WaitForSingleObject(hSema,INFINITE); // 锁定互斥区
for(int k=0;k<10;k++) //和邻居结点交换信息
for(int m=0;thread[current].lingju[m]!='\0';m++)
{
i=thread[current].lingju[m]-65;
if(thread[i].tiaoshu[k]+1<thread[current].tiaoshu[k])
{
thread[current].mudi[k][1]=thread[current].lingju[m];
thread[current].tiaoshu[k]=thread[i].tiaoshu[k]+1;
WaitForSingleObject(hCount,INFINITE); // 锁定互斥区
Count++;
ReleaseSemaphore(hCount,1,NULL); //释放互斥区
}
}
//cout<<"Thread :"<<current<<"is running"<<endl;
ReleaseSemaphore(hSema,1,NULL); //释放互斥区
Sleep(500);
if(count!=Count)
goto loop;
WaitForSingleObject(hOutput,INFINITE); // 锁定互斥区
for(int m=0;m<10;m++)
cout<<char(current+65)<<"→"<<thread[current].mudi[m][0]<<" "<<thread[current].mudi[m][1]<<" "<<thread[current].tiaoshu[m]<<endl;
cout<<"*******************************"<<endl;
ReleaseSemaphore(hOutput,1,NULL); //释放互斥区
//以下用于转发信息
while(1)
{
if(thread[current].buffer[0]!='\0')
{
WaitForSingleObject(hSend,INFINITE); // 锁定互斥区
if(thread[current].buffer[0]==current+65)
{
cout<<endl<<endl<<"以下为主机 "<<thread[current].buffer[0]<<thread[current].buffer[1]<<" 显示的信息:"<<endl<<"******************************"<<endl;
cout<<"有消息来自主机"<<A[0]<<A[1]<<endl;
for(m=2;thread[current].buffer[m]!='\0';m++)
cout<<thread[current].buffer[m];
lujing[counter]=current+65;
lujing[counter+1]='\0';
cout<<endl<<"转发路径为: "<<endl;
for(m=0;m<counter;m++)
cout<<lujing[m]<<"→";
cout<<lujing[m];
cout<<endl<<"******************************"<<endl<<endl<<endl;
counter=0;
thread[current].buffer[0]='\0';
}
else
{
count=thread[current].buffer[0]-65;
count=thread[current].mudi[count][1]-65;
strcpy(thread[count].buffer,thread[current].buffer);
lujing[counter]=current+65;
// lujing[counter+1]='#';
counter=counter+1;
thread[current].buffer[0]='\0';
}
ReleaseSemaphore(hSend,1,NULL); //释放互斥区
}
Sleep(20);
}
return 0;
}
//主程序;;;;;;;;;;;;;;;;;;;;;;
void main(void)
{
DWORD IDThread[10];
HANDLE hThread[10];
int i;
int m;
hSema=CreateSemaphore(NULL,1,1,NULL);
hCount=CreateSemaphore(NULL,1,1,NULL);
hOutput=CreateSemaphore(NULL,1,1,NULL);
hSend=CreateSemaphore(NULL,1,1,NULL);
for(i=0;i<10;i++)
{
for(int s=0;s<10;s++)
quanjuliang.tuopu[i][s]=graph[i][s];
strcpy(quanjuliang.zhuji[i],zhj[i]);
}
begin();
cout<<"*******************最终的路由信息表为*********************"<<endl;
for(i=0;i<10;i++)
{
hThread[i] = CreateThread(NULL, // no security attributes
0, // use default stack size
(LPTHREAD_START_ROUTINE) SubThread, // thread function
(void *)i, // no thread function argument
0, // use default creation flags
&(IDThread[i])); // returns thread identifier
// Check the return value for success.
// if (hThread[i] == NULL)
// cout << "CreateThread error" << i << endl;
// else cout << "CreateThread: " << i << endl;
}
//等待线程结束
Sleep(3000);
jiance:
cout<<"给出源主机号,如“AA”、“AB”、、、、"<<endl;
cin>>A;
i=A[0]-65;
if(strchr(thread[i].zhujibiao,A[1])==NULL)
{
cout<<"你所给的源主机不存在!!"<<endl;
goto jiance;
}
WaitForSingleObject(hSend,INFINITE); // 锁定互斥区
cout<<"发送信息,前两位为目的主机号"<<endl;
cin>>thread[i].buffer;
m=thread[i].buffer[0]-65;
if(strchr(thread[m].zhujibiao,thread[i].buffer[1])==NULL)
{
cout<<"目的主机不存在!!"<<endl;
thread[i].buffer[0]='\0';
goto jiance;
}
ReleaseSemaphore(hSend,1,NULL); //释放互斥区
Sleep(5000);
goto jiance;
WaitForMultipleObjects(10,hThread,TRUE,INFINITE);
printf("\n over \n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -