⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 network.cpp

📁 这是一个用c++实现的网络路由器的路由表信息显示程序
💻 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 + -