📄 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<<"路由表为:"<<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 + -