www.pudn.com > Router.rar > Community.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<<"路由表为:"<0) 
				{ 
					for(int i=0;ih_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; 
}