📄 tcp_sub.cpp
字号:
}
//----------------------------------------------------------------------------------------
void UpdateTransTable(){
BOOL TempTable[NODEMAXNUM][NODEMAXNUM];
int i,j;
for(i=0;i<NODEMAXNUM;i++)
for(j=0;j<NODEMAXNUM;j++)
TempTable[i][j]=FALSE;
CanBeRouter=FALSE;
//-----------------------------------
//NodeNo NET1 NET2
// . .
// . .
// i OK! X
// . .
// . .
// j X OK!
// . .
// . .
//-----------------------------------
//即:本机能通过Net1收到i的报文却不能通过Net2收到,对于j刚好相反.
//则说明:1.本机的两个网络都通讯正常.
// 2.i机的Net2有问题,j机的Net1有问题.
// 3.i,j两机彼此收不到对方的报文,本机却可以收到i,j两机的报文.
// 4.本机可以作为转发器将从Net1(Net2)收到的i(j)机的报文通过Net2(Net1)发送给j(i)机.
//所以:
// TransTable[i][j]=TransTable[j][i]=TRUE;
// CanBeRouter=TRUE;
for(i=0;i<NODEMAXNUM;i++)
if(NodeStatus[i].Net1.IsConnect!=NodeStatus[i].Net2.IsConnect)
for(j=i+1;j<NODEMAXNUM;j++)
if(NodeStatus[j].Net1.IsConnect!=NodeStatus[j].Net2.IsConnect)
if(NodeStatus[i].Net1.IsConnect!=NodeStatus[j].Net1.IsConnect)
{
TempTable[i][j]=TempTable[j][i]=TRUE;
CanBeRouter=TRUE;
}
for(i=0;i<NODEMAXNUM;i++)
for(j=0;j<NODEMAXNUM;j++)
TransTable[i][j]=TempTable[i][j];
#ifndef _TCZ_
if(CanBeRouter==TRUE)
{
if(Router.InUse==FALSE)
//本机可以作为转发器并且当前网上无其他转发器在工作
{
Router.InUse=TRUE;
Router.NodeNo=ATBRouterNo=Addr->scadainf.NodeId-'A';
Router.DelayCount=0;
FrameFlag[ ATB ] = 1;
SendMessage (pStaticThis->HWindow, WM_SENDDATA, 0, 0L);
}
if( Router.NodeNo==Addr->scadainf.NodeId-'A' )//本机正作为当前转发器工作
ATBRouterNo=Addr->scadainf.NodeId-'A'; //不断广播自己的NodeNo以使其它主机确认当前的转发器是谁
else ATBRouterNo=-1;//本机可以作为转发器但当前网上已有其它转发器在工作
}
else //CanBeRouter==FALSE
{
if( Router.InUse==TRUE)
{
if(Router.NodeNo==Addr->scadainf.NodeId-'A')
//本机是当前转发器却不能再作为转发器工作
{
Router.InUse=FALSE;
Router.NodeNo=-1;
Router.DelayCount=0;
ATBRouterNo=-2;
FrameFlag[ ATB ] = 1;
SendMessage (pStaticThis->HWindow, WM_SENDDATA, 0, 0L);
}
else ATBRouterNo=-1;//本机不是当前转发器,也不能作为转发器工作,但却有其他转发器在工作
}
else ATBRouterNo=-1;//本机不是当前转发器,也不能作为转发器工作,也没有有其他转发器在工作
}
#endif
}
//-------------------------------------------------------------------------------------------------
void DispNodeStatus(){
if (!IsIconic (pTcpWin->HWindow))
{
HDC hdc = GetDC (pTcpWin->HWindow);
DWORD dwExt = GetTextExtent (hdc, "S", 1);
WORD nHeight = HIWORD (dwExt);
char str[150]="";
char s1[80]="";
char s2[80]="";
char s3[80]="";
char s4[80]="";
char s5[80]="";
BOOL First=TRUE;
int x = 10;
int y = 10;
int i,j;
y += nHeight +2;
#ifdef _TCZ_
wsprintf(str," 本机 (Fert %c) 统计的当前网上各节点状态:",syscfg->GetNode()+'A');
#else
wsprintf(str," 本机 ( Host %c ) 统计的当前网上各节点状态:",Addr->scadainf.NodeId);
#endif
TextOut (hdc, x, y, str, lstrlen (str));
y += nHeight +2;
y += nHeight +2;
PutAStr(hdc,y," 主机","子网1报文IP","超时计数","子网2报文IP","超时计数");
y += nHeight +2;
y += nHeight +2;
for(i=0;i<NODEMAXNUM;i++)
{
if(i<HOSTNODEMAXNUM) wsprintf(s1,"Host %c ",i+'A');
else{
if(First) { y += 8; First=FALSE; }
wsprintf(s1,"Fert %c ",i-HOSTNODEMAXNUM+'A');
}
if(NodeStatus[i].Net1.IsConnect==TRUE)
wsprintf(s2,"%s ",inet_ntoa(*(LPIN_ADDR)(&NodeStatus[i].Net1.IPAddr)));
else wsprintf(s2,"___.___.___.___");
wsprintf(s3," %u ",NodeStatus[i].Net1.DelayCount);
if(NodeStatus[i].Net2.IsConnect==TRUE)
wsprintf(s4,"%s ",inet_ntoa(*(LPIN_ADDR)(&NodeStatus[i].Net2.IPAddr)));
else wsprintf(s4,"___.___.___.___");
wsprintf(s5," %u ",NodeStatus[i].Net2.DelayCount);
PutAStr(hdc,y,s1,s2,s3,s4,s5);
y += nHeight +2;
}
y += nHeight +2;
y += nHeight +2;
if(Router.InUse==TRUE)
{
if(Router.NodeNo < HOSTNODEMAXNUM)
wsprintf(str,"HOST %c",Router.NodeNo+'A');
else wsprintf(str,"FERT %c",Router.NodeNo-HOSTNODEMAXNUM+'A');
}
else wsprintf(str,"无");
wsprintf(s1,"当前转发节点 : %s ",str);
wsprintf(s3," %d ",Router.DelayCount);
PutAStr(hdc,y,s1,"",s3,"","");
y += nHeight +2;
y += nHeight +2;
if (Router.InUse==TRUE)
{
if(CanBeRouter==TRUE)
{
for(i=0;i<NODEMAXNUM;i++)
for(j=i+1;j< NODEMAXNUM;j++)
if(TransTable[i][j]==TRUE)
{
if(i<HOSTNODEMAXNUM)
wsprintf(s1," Host %c ",i+'A');
else wsprintf(s1," Fert %c ",i-HOSTNODEMAXNUM+'A');
if(j<HOSTNODEMAXNUM)
wsprintf(s3," Host %c ",j+'A');
else wsprintf(s3," Fert %c ",j-HOSTNODEMAXNUM+'A');
PutAStr(hdc,y,s1," <--------------------> ",s3,"","");
y += nHeight +1;
}
}
else
{
BOOL Sign=FALSE;
for(i=0;i<NODEMAXNUM;i++)
if( i!=Router.NodeNo )
{
if( (NodeStatus[i].Net1.IsConnect==TRUE) &&
(NodeStatus[i].Net1.IPAddr==NodeStatus[Router.NodeNo].Net1.IPAddr )
)
{
if(i<HOSTNODEMAXNUM)
wsprintf(s1," Host %c ",i+'A');
else wsprintf(s1," Fert %c ",i-HOSTNODEMAXNUM+'A');
Sign=TRUE;
PutAStr(hdc,y,s1,"","","","");
y += nHeight +1;
}
else if( (NodeStatus[i].Net2.IsConnect==TRUE) &&
(NodeStatus[i].Net2.IPAddr==NodeStatus[Router.NodeNo].Net2.IPAddr)
)
{
if(i<HOSTNODEMAXNUM)
wsprintf(s1," Host %c ",i+'A');
else wsprintf(s1," Fert %c ",i-HOSTNODEMAXNUM+'A');
Sign=TRUE;
PutAStr(hdc,y,s1,"","","","");
y += nHeight +1;
}
}
if(Sign==TRUE)
{
if(Router.NodeNo<HOSTNODEMAXNUM)
wsprintf(str,"Host %c ",Router.NodeNo+'A');
else wsprintf(str,"Fert %c ",Router.NodeNo-HOSTNODEMAXNUM+'A');
wsprintf(s1,"的报文是经 %s 转发而来",str);
PutAStr(hdc,y,s1,"","","","");
y += nHeight+1;
}
}
}
for(i=0;i<10;i++) { PutAStr(hdc,y,"","","","",""); y += nHeight+1; }
ReleaseDC (pTcpWin->HWindow, hdc);
InvalidateRect (pTcpWin->HWindow, NULL, FALSE);
}
}
//--------------------------------------------------------------------------------------------
void PutAStr(HDC hdc,int y,LPSTR s1,LPSTR s2,LPSTR s3,LPSTR s4,LPSTR s5){
int pos[5]={50,120,250,350,480};
char WhiteStr[50]=" ";
if(s1==NULL) TextOut (hdc, pos[0], y, WhiteStr, lstrlen (WhiteStr));
else TextOut (hdc, pos[0], y, s1, lstrlen (s1));
if(s2==NULL) TextOut (hdc, pos[1], y, WhiteStr, lstrlen (WhiteStr));
else TextOut (hdc, pos[1], y, s2, lstrlen (s2));
if(s3==NULL) TextOut (hdc, pos[2], y, WhiteStr, lstrlen (WhiteStr));
else TextOut (hdc, pos[2], y, s3, lstrlen (s3));
if(s4==NULL) TextOut (hdc, pos[3], y, WhiteStr, lstrlen (WhiteStr));
else TextOut (hdc, pos[3], y, s4, lstrlen (s4));
if(s5==NULL) TextOut (hdc, pos[4], y, WhiteStr, lstrlen (WhiteStr));
else TextOut (hdc, pos[4], y, s5, lstrlen (s5));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -