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

📄 community.h

📁 一个距离向量算法的路由器 路由表更新规则: 发现了一条到达某目的的新路由
💻 H
字号:
#include"update.h"

class ROUTER{
public:
	int routerID;//路由器ID****************8
	int myport;//使用的UDP端口,以便发送和接收分组
	SOCKET ListenSocket;//等待接收相邻路由表的信息
	sockaddr_in  src;//绑定地址
	sockaddr_in  client;//发送分组过来的地址
public:
	ROUTER(int routerid,int port);
	~ROUTER();
	static void *ListenThread(void *data);
	bool SendPacket(Route route,int Len,char *host,short port);//发送分组
	bool Listen(int port);//接收分组
};
ROUTER::ROUTER(int routerid,int port)
{
	routerID=routerid;//ID
	myport=port;//端口号
	ListenSocket=INVALID_SOCKET;
#ifdef _WIN32
	WORD VersionRequested=MAKEWORD(1,1);
	WSADATA wsaData;
	WSAStartup(VersionRequested,&wsaData);//启动winsock服务
	if(wsaData.wVersion!=VersionRequested)
	{
		//提示Winsock版本错误
		printf("Wrong version or Winsock not Loaded\n");
		fflush(0);
	}
#endif
}
ROUTER::~ROUTER()
{
	if(ListenSocket!=INVALID_SOCKET)
		closesocket(ListenSocket);//如果已经创建、则关闭
#ifdef _WIN32
	WSACleanup();
#endif
}
bool ROUTER::Listen(int port)
{
	//创建SOCKET
	ListenSocket=socket(PF_INET,SOCK_DGRAM,0);
	if(ListenSocket==INVALID_SOCKET)
	{
		printf("ERROR:socket 创建失败\n");
		fflush(0);
		return false;
	}
	//设定地址
	src.sin_family=PF_INET;
	src.sin_addr.s_addr=htonl(INADDR_ANY);//任何地址
	//确定绑定端口
	src.sin_port=htons(port);
	if(bind(ListenSocket,(struct sockaddr *)&src,sizeof(src))!=0)
	{
		printf("ERROR: 绑定失败\n");
		fflush(0);
		closesocket(ListenSocket);
		return false;
	}
	int ThreadID;//线程ID
	DWORD thread;
	//调用CreateThread创建线程
	ThreadID=(int)CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(ROUTER::ListenThread),(void *)this,0,&thread);
	ThreadID=ThreadID?0:1;
	if(ThreadID)
	{
		printf("线程创建失败\n");
		return false;
	}
	else
		return true;

}
void *ROUTER::ListenThread(void *data)
{
	ROUTER *Router=(ROUTER *)data;
	int len=sizeof(Router->client);
	Route recvroute;//用于接收一个分组,即路由信息
	recvroute.InitRoute();
	while(1)
	{
		int result=recvfrom(Router->ListenSocket,(char *)&recvroute,sizeof(recvroute),0,(sockaddr *)&(Router->client),(int*)&len);
		if(result>0)
		{
			printf("信息来自于主机 %s 端口为%i\n",inet_ntoa(Router->client.sin_addr),ntohs(Router->client.sin_port));
			fflush(0);	
			UpdateTable(&recvroute);
			cout<<"路由表为:"<<endl;
			for(int k=0;k<MAX_ROUTES;k++)
			{
				if(routetable[k].cost>0)
				{
					for(int i=0;i<routetable[k].cost;i++)
					{
						cout<<routetable[k].routpath[i]<<"    ";
					}
					cout<<endl;
				}
			}
		}
	}
}
bool ROUTER::SendPacket(Route route,int Len,char *host,short port)
{
	signed int sent;
	hostent *hostdata;
	if(atoi(host))//ip地址是否为标准形式
	{
		u_long ip = inet_addr(host);
		hostdata=gethostbyaddr((char *)&ip,sizeof(ip),PF_INET);
	}
	else
	{
		hostdata=gethostbyname(host);
	}
	if(!hostdata)
	{
		printf("获得计算机名错误\n");
		fflush(0);
		return false;
	}
	sockaddr_in dest;
	dest.sin_family=PF_INET;
	dest.sin_addr=*(in_addr *)(hostdata->h_addr_list[0]);
	dest.sin_port=htons(port);
	printf("信息已发送到主机%s 端口为:%i\n",inet_ntoa(dest.sin_addr),ntohs(dest.sin_port));
	sent=sendto(ListenSocket,(char*)&route,Len,0,(sockaddr *)&dest,sizeof(sockaddr_in));//***********
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -