📄 tcp_win.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 + -