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;
}