// TCPIP.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "d:\scadahot\DLLEXE\Public\Public.h"
#include "TCPIP.h"
#include "resource.h"
#include "TCPIPDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE TCPIPDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("TCPIP.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(TCPIPDLL, hInstance))
return 0;
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result.
new CDynLinkLibrary(TCPIPDLL);
myCPort::RegisterClass("","TCP/IP协议",RUNTIME_CLASS(myCPortTCPIP));
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("TCPIP.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(TCPIPDLL);
}
return 1; // ok
}
//---------------------------------------------- myCPortTCPIP -----------------
IMPLEMENT_DYNCREATE(myCPortTCPIP, myCPort)
static int nLocalPort = 100;
//初始化
myCPortTCPIP::myCPortTCPIP():myCPort()
{
WSADATA wsaData; //存储WinSock初始化信息
WSAStartup(WINSOCK_VERSION,&wsaData); //初始化动态连接库
struct hostent* pHost = gethostbyname("localhost");//从数据库主机名得到主机信息
struct in_addr inaddr;
memcpy(&inaddr.s_addr,pHost->h_addr,4); //得到源地址
m_strSrcIP = inet_ntoa(inaddr); //翻译网络源地址为字符串
m_strDestIP = "0.0.0.0";
m_nSrcPort = nLocalPort; //源端口
nLocalPort ++;
m_nDestPort = nLocalPort; //目的端口
nLocalPort ++;
m_hSocket = INVALID_SOCKET;
memset((char*)&m_sadSrc,0,sizeof(m_sadSrc));
memset((char*)&m_sadDest,0,sizeof(m_sadDest));
m_pRevBuffer = new BYTE[COMBUFSIZE];
m_nRevLength = 0;
// m_nPreMode = g_AppMode;
//m_nPreMode = APPMODE_OTHER;
}
//析构
myCPortTCPIP::~myCPortTCPIP()
{
WSACleanup();//终止使用WS2_32.DLL
delete[] m_pRevBuffer;
}
//序列化
void myCPortTCPIP::Serialize(CArchive& ar)
{
myCPort::Serialize(ar);
if(ar.IsStoring())
{
ar << m_strSrcIP;
ar << m_strDestIP;
ar << m_nSrcPort;
ar << m_nDestPort;
ar << m_bBroadcast; //added by xiong yong
// ar << m_nPreMode;
}
else
{
ar >> m_strSrcIP;
ar >> m_strDestIP;
ar >> m_nSrcPort;
ar >> m_nDestPort;
ar >> m_bBroadcast; //added by xiong yong
// ar >> m_nPreMode;
}
}
//函数功能:显示一属性页实例
//参数:要显示属性页实例的引用sheet
//返回:布尔值属性页显示成功与否
BOOL myCPortTCPIP::OnAttrib(CPropertySheet& sheet)
{
HINSTANCE hInstOld = AfxGetResourceHandle();//防止动态库中资源号与可执行文件中冲突
AfxSetResourceHandle(TCPIPDLL.hModule);
CPortTCPIPPage pageTCPIP;
pageTCPIP.m_strSrcIP = m_strSrcIP;
pageTCPIP.m_strDestIP = m_strDestIP;
pageTCPIP.m_nSrcPort = m_nSrcPort;
pageTCPIP.m_nDestPort = m_nDestPort;
pageTCPIP.m_bBroadcast = m_bBroadcast;
sheet.AddPage(&pageTCPIP);
if(myCPort::OnAttrib(sheet))//设置IP
{
m_strSrcIP = pageTCPIP.m_strSrcIP;
m_strDestIP = pageTCPIP.m_strDestIP;
m_nSrcPort = pageTCPIP.m_nSrcPort;
m_nDestPort = pageTCPIP.m_nDestPort;
m_bBroadcast = pageTCPIP.m_bBroadcast;
AfxSetResourceHandle(hInstOld);
return TRUE;
}
AfxSetResourceHandle(hInstOld);
return FALSE;
}
//函数功能:建立连接
//参数:空
//返回:空
void myCPortTCPIP::OpenCom(void) //add814
{
/* BOOL Flag = TRUE;
HWND hWndThis = AfxGetApp()->m_pMainWnd->m_hWnd;
if(hWndThis){
HWND hWnd = hWndThis;
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
CString strTitle;
while(Flag){
Flag = FALSE;
while( hWnd != hWndThis){
if(hWnd==NULL) break;
::GetWindowText(hWnd,strTitle.GetBuffer(8),8);
if(strTitle=="SCADANT"){
// ::SendMessage(hWnd, MYWM_MODIFIED, NULL, NULL);
// break;
Flag = TRUE;
}
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
}
}
}
*/
// if(g_AppMode == APPMODE_SERVER && m_nPreMode == APPMODE_BACKUP){
/*
if(g_pMngCom->m_bConvert)
{
int nPort = m_nDestPort;
m_nDestPort = m_nSrcPort;
m_nSrcPort = m_nDestPort;
CString strIP = m_strDestIP;
m_strDestIP = m_strSrcIP;
m_strSrcIP = strIP;
}
CString strErrorNo;
struct protoent* pProto = getprotobyname("udp");//协议名
if(pProto==NULL)
{
strErrorNo.Format("%d",WSAGetLastError());
SetComError("映射协议\"udp\"失败,错误号:"+strErrorNo);
return;
}
m_hSocket = socket(PF_INET,SOCK_DGRAM,pProto->p_proto);//建立一个套接字
if(m_hSocket==INVALID_SOCKET)
{
strErrorNo.Format("%d",WSAGetLastError());
SetComError("创建SOCKET失败,错误号:"+strErrorNo);
return;
}
struct hostent* pHost = gethostbyname("localhost"); //???这句好像没用
//..............................................................................
m_sadSrc.sin_family = AF_INET; //生成源地址 m_sadSrc
m_sadSrc.sin_port = htons(m_nSrcPort);
unsigned long ulSrcIP = inet_addr(m_strSrcIP);
memcpy(&m_sadSrc.sin_addr,&ulSrcIP,4);
m_sadDest.sin_family = AF_INET; //生成目的地址 m_sadDest
m_sadDest.sin_port = htons(m_nDestPort);
unsigned long ulDestIP;
if (m_bBroadcast)
ulDestIP = INADDR_BROADCAST;
else
ulDestIP = inet_addr(m_strDestIP);
memcpy(&m_sadDest.sin_addr,&ulDestIP,4);
int rc = bind(m_hSocket,(struct sockaddr*)&m_sadSrc,sizeof(m_sadSrc));//将socket与源地址绑定
if(rc!=0)
{
DWORD dwErrorNo = WSAGetLastError();
CString strComError;
strComError.Format("SOCKET打开时错误,错误码:%lu",dwErrorNo);
SetComError(strComError);
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
}
else
{
DWORD cbInQue = 1;
ioctlsocket(m_hSocket,FIONBIO,&cbInQue);//nonblocking mode of socket控制I/O Socket模式
if (m_bBroadcast){
BOOL bEnable = true;
setsockopt(m_hSocket,SOL_SOCKET,SO_BROADCAST, (char*)&bEnable, sizeof(bEnable));
}
}
*/
//........................................................................................
BOOL bResult = TRUE;
DWORD dwErrorNo;
if(bResult)
{
CString strErrorNo;
struct protoent* pProto = getprotobyname("udp");//协议名
if(pProto==NULL)
{
strErrorNo.Format("%d",WSAGetLastError());
SetComError("映射协议\"udp\"失败,错误号:"+strErrorNo);
return;
}
m_hSocket = socket(PF_INET,SOCK_DGRAM,pProto->p_proto);//建立一个套接字
if(m_hSocket==INVALID_SOCKET)
{
strErrorNo.Format("%d",WSAGetLastError());
SetComError("创建SOCKET失败,错误号:"+strErrorNo);
return;
}
m_sadSrc.sin_family = AF_INET; //生成源地址 m_sadSrc
m_sadSrc.sin_port = htons(m_nSrcPort);
unsigned long ulSrcIP = inet_addr(m_strSrcIP);
memcpy(&m_sadSrc.sin_addr,&ulSrcIP,4);
int rc = bind(m_hSocket,(struct sockaddr*)&m_sadSrc,sizeof(m_sadSrc));//将socket与源地址绑定
if(rc!=0)
{
dwErrorNo = WSAGetLastError();
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
bResult = FALSE;
}
else
{
bResult = TRUE;
m_sadDest.sin_family = AF_INET; //生成目的地址 m_sadDest
m_sadDest.sin_port = htons(m_nDestPort);
unsigned long ulDestIP;
if (m_bBroadcast)
ulDestIP = INADDR_BROADCAST;
else
ulDestIP = inet_addr(m_strDest
评论0