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

📄 tcp_win.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
字号:

#include "tcp_win.h"
 
HWND hTcpWin=NULL;
PTcpWin pTcpWin;
TCPINFO   TcpInfo;

#ifdef _TCZ_
 extern  BYTE huge *BUFbuf;
#endif
//---------------------------------------------------------------------------
void InitTcpWin(PTWindowsObject AParent){
	pTcpWin= new TcpWin(AParent, "TCP/IP通讯");
	AParent->GetApplication()->MakeWindow(pTcpWin);
}
//---------------------------------------------------------------------------
void TcpWin::ErrorProc(){
  PostMessage(HWindow,WM_CLOSE,0,0L);
  MessageBox(HWindow,"通信程序已关闭,请检查您的系统(网络)设置","错误",MB_OK|MB_ICONSTOP);
}
//---------------------------------------------------------------------------
DWORD TcpWin::GetSubnetFromHost(DWORD dwIPAddr)//将dwIPAddr默认为C类地址处理;
		   {
		   return ( dwIPAddr | htonl(0x000000FF) );
			// dwIPAddr 内IP地址是以网络字节序存放,
			//即:(低内存地址)200.200.200.8(高内存地址)
			//所以将"0x000000FF"转换成网络字节序与dwIPAddr运算
			//结果将为:200.200.200.255
			//否则结果将为:255.200.200.8
		   } 
//---------------------------------------------------------------------------
DWORD  TcpWin::GetThisSubnetIPAddr(int i)
{
   if( i==0 || i==1)
     return SubnetIPAddr[i];
   else  return SubnetIPAddr[0];
}
//----------------------------------------------------------------------------
void  TcpWin::SwapNetIP(){
DWORD  TempIPAddr;
	   TempIPAddr=SubnetIPAddr[0];
	   SubnetIPAddr[0]=SubnetIPAddr[1];
	   SubnetIPAddr[1]=TempIPAddr;
}
//----------------------------------------------------------------------------
void TcpWin ::BroadcastData(LPSTR Buf){
 memmove(SndSocBuf,Buf,SOC_BUF_LEN);
 SendMessage(HWindow,WM_CLIENT,0,SEND_DGRAM);//'0'--------broadcast to each subnet 
}
//----------------------------------------------------------------------------
void TcpWin :: SendData2Host(LPSTR Buf,DWORD dwIPAddr){
 memmove(SndSocBuf,Buf,SOC_BUF_LEN);
 DestIPAddr=dwIPAddr;
 SendMessage(HWindow,WM_CLIENT,1,SEND_DGRAM);//'1'--------directly send data to destinate address 
}
//---------------------------------------------------------------------------
BOOL TcpWin :: InitWinsock()
{
  WSADATA wsaData;	// Winsock implementation details
  if (WSAStartup(WINSOCK_VERSION, &wsaData)){
	       MessageBox(HWindow, "Could not load Windows Sockets DLL.",Title , 
				MB_OK|MB_ICONSTOP);
		   return FALSE;
		   }

  else return TRUE;
}
//---------------------------------------------------------------------------
void TcpWin::EndWinsock()
{
   WSACleanup();	// Free all allocated program resources and exit
}
//---------------------------------------------------------------------------
void TcpWin::InitIPAddr()
{
   char  HostName[30]="";
   LPHOSTENT lpHostEnt;
   DWORD dwIPAddr;
   int   nNetNum;
   int i;

   //------------initialize all IP addr to INADDR_NONE-----------------
	  for(i=0;i<2;i++) ThisIPAddr[i]=SubnetIPAddr[i]=INADDR_NONE;
      MisSrvIPAddr=DestIPAddr=INADDR_NONE;
   //------------------------------------------------------------------

	  gethostname(HostName,30);
 	  if (!HostName)
  	   {
		MessageBox(GetFocus(), "Could not recognize the hostname!",
			"InitServer Error",MB_OK|MB_ICONSTOP);
		ErrorProc();
		return;
  	   }

	  lpHostEnt = gethostbyname(HostName);

	  if (!lpHostEnt)
  	     {
		 MessageBox(GetFocus(), "Could not get Any IP address!",
					 HostName,MB_OK|MB_ICONSTOP);
		 ErrorProc();
		 return;
   	     }

	  if( (TcpInfo.DBNet==FALSE)||(TcpInfo.NodeType==MISNODE) )  nNetNum=1;
      else                                                       nNetNum=2;

  	  for(i=0;i<nNetNum;i++)
	     {
		  if( lpHostEnt->h_addr_list[i]!=NULL )
		     {
		  	  ThisIPAddr[i]= *((DWORD *)lpHostEnt->h_addr_list[i]);
			  SubnetIPAddr[i]=GetSubnetFromHost(ThisIPAddr[i]);
             }
		 }
	 #ifndef _TCZ_
	  if(TcpInfo.NodeType==GATEWAY)
         {
		  if((MisSrvIPAddr=inet_addr(TcpInfo.MisSrvName)) == INADDR_NONE)
		     {
			  lpHostEnt = gethostbyname(TcpInfo.MisSrvName);
	          if (!lpHostEnt)
				  {
				   hTcpWin=NULL;
		           MessageBox(GetFocus(), "Error:Could not get Mis net Server IP address!",
										   TcpInfo.MisSrvName,MB_OK|MB_ICONSTOP);
				   hTcpWin=HWindow;
				   return;
				  }
			  MisSrvIPAddr=*((DWORD *)*lpHostEnt->h_addr_list);
			 }


          //error detect
		  if( (MisSrvIPAddr!=INADDR_NONE) &&
                  (
			       (GetSubnetFromHost(MisSrvIPAddr)==SubnetIPAddr[0] ) ||
				   (GetSubnetFromHost(MisSrvIPAddr)==SubnetIPAddr[1] )
                  )
			){
			   hTcpWin=NULL;
		       MessageBox(GetFocus(), "Error: MIS 网IP地址与本网IP地址重复,请重新设置!",
										   TcpInfo.MisSrvName,MB_OK|MB_ICONSTOP);
			   return;
             }


		  if(TcpInfo.Broadcast==TRUE) MisSrvIPAddr=GetSubnetFromHost(MisSrvIPAddr);
		 }
     #endif

}
//---------------------------------------------------------------------------
TcpWin::TcpWin(PTWindowsObject AParent, LPSTR ATile)
          :TWindow(AParent, ATile)
{
    Attr.X = 100;
    Attr.Y = 50;
	Attr.W = 500;
	Attr.H = 450;
	Attr.Style |= //WS_VSCROLL | WS_HSCROLL |
	 WS_THICKFRAME | WS_POPUPWINDOW | WS_CAPTION | WS_HSCROLL | WS_VSCROLL | WS_BORDER | WS_MAXIMIZEBOX | WS_MINIMIZEBOX;
  #ifndef _TCZ_
    AssignMenu ("TCPMENU");
  #endif
}
//---------------------------------------------------------------------------
TcpWin::~TcpWin ()
{
  EndWinsock();
  KillTimer(HWindow,1);
  KillTimer(HWindow,2);
  hTcpWin=NULL;
  MessageBeep(0);
}
//---------------------------------------------------------------------------
void TcpWin::GetWindowClass (WNDCLASS _FAR & AWndClass)
{
    TWindow::GetWindowClass (AWndClass);
//	AWndClass.hIcon=LoadIcon (GetApplication ()->hInstance, "COMMWIN");
    AWndClass.style |= CS_NOCLOSE ;
}

//---------------------------------------------------------------------------
void TcpWin::SetupWindow ()
{
    TWindow::SetupWindow ();

	hTcpWin=HWindow;

	if( InitWinsock() == FALSE){
		ErrorProc();
		return;
		}

  #ifdef _TCZ_
	InitHostNodeStatus();
  #else
	ReadTcpInfo();

	if(TcpInfo.NodeType==MISNODE) InitMisNodeStatus();
	else                          InitHostNodeStatus();
  #endif
	InitIPAddr();

	PostMessage(HWindow,WM_SERVER,0,CREAT_SOCK);
	PostMessage(HWindow,WM_CLIENT,0,CREAT_SOCK);

    if (!SetTimer (HWindow, 1, 2000U, NULL))
       MessageBox (HWindow, "计时器太多", "警告", MB_ICONEXCLAMATION | MB_OK);

  #ifndef _TCZ_
	if(TcpInfo.NodeType==MISNODE)
   	   if (!SetTimer (HWindow, 2, 4000U, NULL))
			 MessageBox (HWindow, "计时器太多", "警告", MB_ICONEXCLAMATION | MB_OK);
  #endif

//	ShowWindow(HWindow, SW_SHOWMINIMIZED);
}
//-------------------------------------------------------------------------
void TcpWin::WMTimer(RTMessage Msg){

	switch (Msg.WParam) {
	  case 1:
		#ifndef _TCZ_
		 if(TcpInfo.NodeType==MISNODE)
				   UpdateMisNodeStatus();
		 else
		  {
        #endif
		   DispNodeStatus();
           UpdateNodeStatus();
		   UpdateTransTable();
		#ifndef _TCZ_
		  }
        #endif
		  break;
	  #ifndef _TCZ_
 	  case 2:
		 if(TcpInfo.NodeType==MISNODE)
			   SendMisNodeATB();
		 break;
      #endif
	  default: break;
        }
}
//---------------------------------------------------------------------------
void TcpWin::WMServer(RTMessage Msg)
{ 
  char Mesg[80]="";
  switch(Msg.LParam){
    case CREAT_SOCK:
	  SOCKADDR_IN ServerSocAddr;

	  // Configure the socket
	  // Define the socket address	
	  ServerSocAddr.sin_family = AF_INET;	
	  ServerSocAddr.sin_port = htons(SERVER_PORT);  
 	  ServerSocAddr.sin_addr.s_addr = INADDR_ANY;
				
	  // Create the socket
	  RcvSoc = socket(AF_INET, SOCK_DGRAM, DEFAULT_PROTOCOL);
	  if (RcvSoc == INVALID_SOCKET)
	      {
		  MessageBox(HWindow, "Invalid socket RcvSoc!!",
			"InitServer Error" ,MB_OK|MB_ICONSTOP);
			  ErrorProc();
	      	  return;
	      }

	  // Bind the socket
	  if(bind(RcvSoc,(sockaddr FAR *)(& ServerSocAddr),sizeof(ServerSocAddr))
                                             ==SOCKET_ERROR)
  	      {
	       MessageBox(HWindow, "cannot bind!!", "InitServer Error",
					MB_OK|MB_ICONSTOP);
			   closesocket(RcvSoc);
			   ErrorProc();
	       return;
	      }

	 if(WSAAsyncSelect(RcvSoc,HWindow,WM_SERVER,FD_READ|FD_CLOSE)==SOCKET_ERROR)
	     {
		 MessageBox(HWindow, "select RcvSocket error",
		     "InitServer Error",MB_OK|MB_ICONSTOP);
			 closesocket(RcvSoc);
			 ErrorProc();
             return;
	     }

	 break;

    case FD_READ:
		 int len;
	     int AddrLen=sizeof(SOCKADDR_IN);   //This is very important !
		 SOCKADDR_IN FromSocAddr;

		if((len=recvfrom(RcvSoc,RcvSocBuf,SOC_BUF_LEN,0,
		(sockaddr FAR *)&FromSocAddr,(int FAR *)&AddrLen))==SOCKET_ERROR)
		   {
		   wsprintf(Mesg,"error during recvfrom! Error Code=%d",
						  WSAGetLastError());
                		
		   MessageBox(HWindow, Mesg, "Receive Error",
				MB_OK|MB_ICONSTOP);
		   }
	   else{
		 #ifdef _TCZ_
		   H_ProRcvGram(RcvSocBuf,FromSocAddr.sin_addr.s_addr);
	       memmove(BUFbuf, RcvSocBuf, 512);
         #else
		   if(TcpInfo.NodeType==MISNODE) M_ProRcvGram(RcvSocBuf,FromSocAddr.sin_addr.s_addr);
		   else                          H_ProRcvGram(RcvSocBuf,FromSocAddr.sin_addr.s_addr);
         #endif
           }

	   break;
    case FD_CLOSE:
    	   if(WSAAsyncSelect(RcvSoc,HWindow,0,0)==SOCKET_ERROR)
               {
		 MessageBox(HWindow, "select RcvSoc 0,0 error", "Error",
	  				MB_OK|MB_ICONSTOP);
	    	 closesocket(RcvSoc);
                 return;
	       }
	   closesocket(RcvSoc);

	   break;
    
    default:break;
	}
    
}
//-------------------------------------------------------------------------
BOOL boxup=FALSE;
void TcpWin::WMClient(RTMessage Msg)
{
  char Mesg[80]="";
  switch(Msg.LParam){
     case CREAT_SOCK:
      SOCKADDR_IN ClientSocAddr;
 
	  // Configure the socket
	  // Define the socket address	
	  ClientSocAddr.sin_family = AF_INET;	
	  ClientSocAddr.sin_port = htons(CLIENT_PORT);
	  ClientSocAddr.sin_addr.s_addr=INADDR_ANY;

	  // Create the socket
	  SndSoc = socket(AF_INET, SOCK_DGRAM, DEFAULT_PROTOCOL);
	  if (SndSoc == INVALID_SOCKET)
	      {
		  MessageBox(HWindow, "Invalid socket SndSoc!!","InitClient Error" , 
					MB_OK|MB_ICONSTOP);
		  ErrorProc();
		  return;
	      }


	    // Bind the socket
      if(bind(SndSoc,(sockaddr FAR *)(& ClientSocAddr),sizeof(ClientSocAddr))
                                               ==SOCKET_ERROR)
               {
				MessageBox(HWindow, "cannot bind!!", "InitClient Error",
					MB_OK|MB_ICONSTOP);
				closesocket(SndSoc);
				ErrorProc();
                return;
               }

	  if(WSAAsyncSelect(SndSoc,HWindow,WM_CLIENT,FD_CLOSE)==SOCKET_ERROR)
	      {
	        MessageBox(HWindow, "select SndSoc error", "InitClient Error",
	       				MB_OK|MB_ICONSTOP);
			closesocket(SndSoc);
			ErrorProc();
	        return;
	      }
	  break;

	 case SEND_DGRAM:
	  SOCKADDR_IN DestSocAddr;
	  if(Msg.WParam==0){ //broadcast datagram to every subnet
	     for(int i=0;i<2;i++){
			if(SubnetIPAddr[i]!=INADDR_NONE){
             DestSocAddr.sin_family = AF_INET;	// Internet address family
			 DestSocAddr.sin_port = htons(SERVER_PORT); //user port No:1024--5000
		     DestSocAddr.sin_addr.s_addr=SubnetIPAddr[i];

			 if( (sendto(SndSoc,SndSocBuf,SOC_BUF_LEN,0,
			   (sockaddr FAR *)&DestSocAddr,sizeof(DestSocAddr))==SOCKET_ERROR)
                    &&boxup==FALSE)
		      {
		        boxup=TRUE;
        	    MessageBox(HWindow, "error during send", "Send Error",
					MB_OK|MB_ICONSTOP);
		        boxup=FALSE;
		      }
			}//if(SubnetIPAddr[i]!=IN_ADDRNONE)
		 }//for
	  }//if(Msg.LParam==IN_ADDRANY)
	  else{//send dgram to IP addr specified in DestIPAddr
		if(DestIPAddr!=INADDR_NONE){
		   DestSocAddr.sin_family = AF_INET;	// Internet address family
		   DestSocAddr.sin_port = htons(SERVER_PORT); //user port No:1024--5000
		   DestSocAddr.sin_addr.s_addr=DestIPAddr;
		   //DespIPAddr is a private member of TcpWin class
		   //it should be give a value before
		   //use PostMessage(HWindow,WM_SERVER,1,CREAT_SOCK);
								  
	       if( (sendto(SndSoc,SndSocBuf,SOC_BUF_LEN,0,
		       (sockaddr FAR *)&DestSocAddr,sizeof(DestSocAddr))==SOCKET_ERROR)
                    &&boxup==FALSE)
			  {
		        boxup=TRUE;
        	    MessageBox(HWindow, "error during send", "Send Error",
					MB_OK|MB_ICONSTOP);
		        boxup=FALSE;
		      }
          }
      }

	 break;

     case FD_CLOSE:
          closesocket(SndSoc);
	  break;

     default:break;
     }
  
}

⌨️ 快捷键说明

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