监听程序
ORA-12516 TNS 监听程序无法找到匹配协议栈的可用句柄
使用PL/SQL Developer 数据库远程客户端连接程序连接数据库:错误信息:ORA-12516: TNS: 监听程序无法找到匹配协议栈的可用句柄.TNS-12516 TNS:listener could not find available handler with matching protocol stack导致原因可能为:1.一般是由于数据库的当前会话数不满足造成的,相关的参数有两个:processes和sessions(1)首先查看当前这两个参数的值sql>conn / as sysdbasql>select count(*) from v$session; 从这里可以看出当前的session数sql>show parameter processes; 从输出的信息可以看到当前数据库中参数processes 的值sql>show parameter sessions; 从输出的信息可以看到当前数据库中参数sessions的值这二者的关系是:sessions=(1.1*processes+5)(2)修改这两个参数alter system set processes=300 scope=spfile;alter system set sessions=335 scope=spfile;(3)重新启动数据库服务,使这两个参数生效。
(4)如果数据库服务无法正常启动,则可能是solaris10系统参数seminfo_semmns设置的偏小,因为每个process会占用一个semmns,semmns调整后需要重新启动操作系统。
semmns的计算公式为:SEMMNS>processes+instance_processes+system processes=数据库参数processes的值instance_processes=5(smon,pmon,dbwr,lgwr,arch)2.可能是tnsnames.ora文件中的配置的"SERVICE_NAME ="和对应值(数据库名称)中间多了个空格,需要去掉之间的空格,好像有没有空格没有影响,已验证(可能有时候是这样引发ORA-12516)3.如果做以上操作仍无法排除ORA-12516 ,需要做最后尝试:单独重启启动databasenameSeverice (databasename:是要连接目标数据库而引发ORA-12516 错误的目标数据库名称)已尝试:有效(4) listener.log日志太大引发的,listener.log日志记录了通过listener处理的网络请求信息,它包含客户端请求的时间,连接方式(专用或共享),连接程序,网络协议,主机名,网络端口号等信息,listener.log的文件内容没有太大意义,可以不让listener 写日志。
微信小程序实现watch监听
微信⼩程序实现watch监听Vue 提供了⼀种通⽤的⽅式来观察和响应 Vue 实例上的数据变动:监听属性 watch。
虽然watch的滥⽤会导致性能不佳,但在⼀些情况下我们还是需要watch,使得代码更加简洁、逻辑更加清晰(其实就是嫌⿇烦...)。
⼩程序实现类似vue ⼀样的watch 监听数据将⽅法注册到app.js 中也可以使⽤⾼级⼀点的写法使⽤装饰器模式将⼩程序page 重写挂在到⽣命周期函数上或者挂在页⾯this 上每次就不需要重新在调⽤初始化⼀次。
本⽂对装饰器模式不做介绍这是个思路。
等待下次实现setWatcher(page) {let data = page.data; // 获取page 页⾯datalet watch = page.watch;for(let i in watch){let key = i.split('.'); // 将watch中的属性以'.'切分成数组let nowData = data; // 将data赋值给nowDatalet lastKey = key[key.length - 1];let watchFun = watch[i].handler || watch[i]; // 兼容带handler和不带handler的两种写法let deep = watch[i].deep; // 若未设置deep,则为undefinethis.observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey}},/\*\*\* 监听属性并执⾏监听函数\*/observe(obj, key, watchFun, deep, page) {let val = obj[key];// 判断deep是true 且 val不能为空且 typeof val==='object'(数组内数值变化也需要深度监听)if (deep && val != null && typeof val === 'object') {for(let i in val){this.observe(val, i, watchFun, deep, page); // 递归调⽤监听函数}}let that = this;Object.defineProperty(obj, key, {configurable: true,enumerable: true,set: function (value) {// ⽤page对象调⽤,改变函数内this指向,以便this.data访问data内的属性值watchFun.call(page, value, val); // value是新值,val是旧值val = value;if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。
ORA-12514TNS监听程序当前无法识别连接描述符中请求服务的解决方法
ORA-12514TNS 监听程序当前无法识别连接描述符中请求服务的解决方法监听配置文件liste ner.ora中可以不必指定监听的服务名(安装Orac le11g后也是没有指定的)。
正常情况下一般只要数据库启动,客户端连接数据库也没有什么问题,但是有时重复启动关闭也会出现OR A-12514错误。
既然list ener.ora中没有指定监听,我们可以在l isten er.ora文件中指定监听的实例名,这样该问题应该可以连接。
步骤如下:在oracl e服务器O racle安装目录(我的在D:\app\produc t\11.2.0\dbhome_1下,每个人的不一样,根据自己的情况查找)Networ k/admin目录下找到l isten er.ora 我的如下图所示# listen er.ora Networ k Config urati on File:D:\app\produc t\11.2.0\dbhome_1\NETWOR K\ADMIN\listen er.ora# Genera ted by Oracle config urati on tools.SID_LI ST_LI STENE R =(SID_LI ST =(SID_DE SC =(SID_NA ME = CLRExt Proc)(ORACLE_HOME = D:\app\produc t\11.2.0\dbhome_1)(PROGRA M = extpro c)(ENVS ="EXTPRO C_DLL S=ONLY:D:\app\produc t\11.2.0\dbhome_1\bin\oraclr11.dll") )(SID_DE SC =(GLOBAL_DBNA ME = ORCL)(ORACLE_HOME = D:\app\produc t\11.2.0\dbhome_1)(SID_NA ME = ORCL)))LISTEN ER =(DESCRI PTION_LIST =(DESCRI PTION =(ADDRES S = (PROTOC OL = IPC)(KEY = EXTPRO C1521)))(DESCRI PTION =(ADDRES S = (PROTOC OL = TCP)(HOST = 192.168.58.130)(PORT = 1521)) ))ADR_BA SE_LI STENE R = D:\app标红的为我添加的部分,ORCL为监听的实例名。
ORA-12518TNS监听程序无法分发客户机连接解决办法
无法连接到数据库实例: ORA-12518: TNS: 监听程序无法分发客户机连接2008-05-30 11:48可能是如下的原因:客户连接到监听器后,监听器把客户重定向到调度程序端口(很可能不是1521端口),由于操作系统问题,这些连接会被拒绝。
要解决这个问题,只需要在LISTENER。
ORA的头部加入这一行DIRECT_HANDOFF_TTC_LISTENER = OFF 即可。
1:根据搜索到的原因,我们在LISTENER。
ORA头部加入这一行--------------------------------------------------------------------------------# listener.ora NETwork Configuration File:D:\Oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora# Generated by Oracle configuration tools.DIRECT_HANDOFF_TTC_LISTENER = OFFSID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = PLSExtProc)(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)(PROGRAM = extproc)))LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)))(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))))--------------------------------------------------------------------------------2:执行以下命令重启监听器和EM-------------------------------------------------------------------------------- lsnrctl stoplsnrctl startemctl stop dbconsoleemctl start dbconsole--------------------------------------------------------------------------------3:查看监听器状态和登入EM,看到状态,一切正常-------------------------------------------------------------------------------- D:\Documents and Settings\gdy>lsnrctl serviceLSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 15-7月 -2007 18:2 8:19Copyright (c) 1991, 2005, Oracle. All rights reserved.正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))服务摘要..服务 "PLSExtProc" 包含 1 个例程。
ORA-12518 TNS 监听程序无法分发客户机连接
ORA-12518: TNS: 监听程序无法分发客户机连接在团队成员增多时,经常出现“无法分发客户端连接”等问题。
在网上搜索一番后,最终解决了该问题,现将解决方案总结如下,以供参考和以后备用。
原因:团队成员增多,原有数据库设置不够用,导致连接plsql和启动tomcat时经常抛出“无法分发客户端连接”的异常。
解决方案:第一步:调整process和session值1. 检查process和session是否够用。
a)使用plsql连接到oracle,查看process进程数:select count(*) from v$process; --取得数据库目前的进程数。
select value from v$parameter where name = 'processes'; --取得进程数的上限。
b)查看session会话数:select count(*) from v$session; --取得数据库目前的会话数。
select value from v$parameter where name = 'sessions'; --取得会话数的上限。
查看当前process和sessions是否接近上限值。
若接近,可以将其增大。
2. 调整这两个参数值大小。
系统进程数process和系统会话数session之间存在一个关系:process数=session数*1.1+5我们在配置时参考该规律进行设定。
a) 修改process值alter system set processes=1000 scope=spfile; --将process值改为1000b) 修改session值alter system set sessions=1105 scope=spfile; --将sessions值改为11053. 备份pfile,重启oraclea) 修改完成后,备份pfilecreate pfile from spfile; --从spfile(运行时配置)创建pfile(系统配置)c) 重启oracle重启的方法有很多种,可以重启oracle服务,或者重启数据库。
python监听回调函数
python监听回调函数Python 监听回调函数在编程领域中,回调函数是一种常见的编程模式。
回调函数可以作为参数传递给其他函数,以便在特定事件发生时被调用。
这种机制使得代码更加灵活和可扩展。
在Python中,我们可以通过使用装饰器、事件驱动框架或自定义类等方式来实现回调函数的监听。
本文将详细介绍如何使用Python来监听回调函数,并提供一步一步的指导。
我们将以创建一个简单的事件处理器为例,来解释回调函数的监听过程。
让我们开始吧!第一步:定义回调函数在正式编写监听回调函数之前,首先需要定义回调函数。
回调函数是在特定事件发生时被调用的函数。
它可以接收一些参数,并根据需要来处理这些参数。
在这个例子中,我们将定义一个简单的回调函数,用于接收一个整数参数并将其打印出来。
请看下面的代码示例:pythondef callback_func(number):print("Callback function called with number:", number)# 测试回调函数的调用callback_func(5)运行以上代码,你会看到输出结果为"Callback function called with number: 5"。
第二步:创建事件触发器在事件触发器函数中,我们将接收一个回调函数,并在特定事件发生时调用该函数。
让我们看一个示例:pythondef event_trigger(callback):print("Event occurred!")callback(10)# 调用事件触发器函数event_trigger(callback_func)在上述代码中,我们定义了一个事件触发器函数(event_trigger),它接收一个回调函数作为参数并在事件发生时调用该回调函数。
在事件触发器函数中,我们首先打印了"Event occurred!" 这个消息,然后调用回调函数,并将一个整数值作为参数传递给它。
监听器的工作原理
监听器的工作原理
监听器的工作原理是通过注册一个特定的事件处理器(handler)来监听特定的事件并采取相应的操作。
当一个事件(如鼠标点击、键盘按键、页面加载等)发生时,监听器会接收到该事件的通知。
监听器会调用事件处理器来处理这个事件,事件处理器就是在监听器中注册的一个函数或方法。
监听器通过向事件源注册自己来实现监听事件的目的,事件源可以是一个特定的对象,如按钮、文本框等,也可以是整个应用程序或操作系统。
监听器的工作原理可以简单描述为以下步骤:
1. 事件源注册监听器:监听器向事件源注册自己,告诉事件源自己对特定的事件感兴趣。
2. 事件发生:当注册的事件发生时,事件源会通知所有相关的监听器。
3. 事件通知:事件源将事件通知发送给已注册的监听器。
4. 事件处理:监听器接收到事件通知后,调用相应的事件处理器来处理事件。
5. 事件处理器执行:事件处理器执行特定的操作或调用其他的函数/方法来完成特定的任务。
通过监听器的工作原理,我们可以实现对不同事件的监听,并在事件发生时执行相应的操作,从而实现程序的灵活性和响应性。
简述监听器的使用流程
简述监听器的使用流程1. 什么是监听器监听器(Listener)是一种常用的编程技术,用于监听并响应特定事件的发生。
在编程中,我们经常需要对某些事件进行处理,例如用户点击按钮、网页加载完成、数据改变等等,这时候就可以通过监听器来捕获并处理这些事件。
2. 监听器的分类在Java语言中,监听器主要分为两类:事件监听器和属性监听器。
2.1 事件监听器事件监听器用于监听特定的事件,并在事件发生时执行相应的操作。
在Java中,我们可以通过为组件添加事件监听器来实现对按钮点击、键盘输入、鼠标移动等事件的监听。
常见的事件监听器包括:•ActionListener:监听按钮点击事件•MouseListener:监听鼠标点击、鼠标移动等事件•KeyListener:监听键盘按下、键盘释放等事件2.2 属性监听器属性监听器用于监听对象的属性变化,并在属性发生改变时执行相应的操作。
属性监听器通常与JavaBean一起使用,可以实现对JavaBean属性的监控和响应。
3. 使用流程监听器的使用流程主要包括以下几个步骤:3.1 确定需要监听的事件或属性首先,我们需要确定需要监听的事件或属性。
例如,如果我们想监听一个按钮的点击事件,就需要使用ActionListener监听器。
3.2 创建监听器对象创建一个监听器对象,可以是内部类的实例,也可以是外部类的实例。
监听器对象负责实现监听器接口,并重写相应的事件处理方法。
3.3 将监听器添加到组件将监听器对象添加到需要监听的组件中。
例如,如果我们想监听一个按钮的点击事件,就需要使用addXXXListener()方法将监听器对象添加到按钮中。
3.4 实现事件处理方法在监听器对象中实现相应的事件处理方法。
不同的监听器接口有不同的事件处理方法,我们需要根据需要重写相应的方法并编写相应的处理逻辑。
3.5 注册监听器将监听器注册到组件中,使其开始监听特定的事件或属性。
注册方法通常以addXXXListener()的形式存在。
trap v3 监听 java实现 简书
文章标题:trap v3 监听 Java 实现1. 介绍trap v3监听的概念trap v3 是一种网络监控系统,用于对网络中的数据进行监听和分析。
通过对trap v3监听的实现,可以实时监控网络中的数据流动情况,并对异常情况进行警告和处理。
2. Java语言在trap v3监听实现中的应用Java语言作为一种强大的编程语言,可以轻松实现trap v3监听系统。
它的优势在于跨评台性和丰富的库支持,使得在不同的操作系统上都能够进行trap v3监听的实现。
3. trap v3监听的实现步骤在Java语言中实现trap v3监听系统,需要经过以下步骤:3.1 设定监听端口和IP位置区域3.2 接收trap v3数据包3.3 解析数据包内容3.4 分析数据包内容并进行相应处理3.5 响应处理结果3.6 监听系统的优化和改进4. Java实现trap v3监听的代码示例下面是一个简单的Java代码示例,用于实现trap v3监听:// 设定监听端口和IP位置区域InetAddress address = InetAddress.getByName("0.0.0.0"); int port = 162;// 创建监听器SnmpTrapReceiver receiver = new SnmpTrapReceiver(); receiver.listen(address, port);// 接收trap v3数据包SnmpTrapEvent event = receiver.receive();// 解析数据包内容// ...// 分析数据包内容并进行相应处理// ...// 响应处理结果// ...// 监听系统的优化和改进// ...5. trap v3监听系统的优势和应用场景trap v3监听系统可以在网络安全监控、网络优化管理等方面发挥重要作用。
通过实时监控网络中的数据流动情况,可以提高网络的安全性和稳定性,保障网络运行的顺畅。
java监听器实现原理
java监听器实现原理Java监听器实现原理在Java应用程序中,事件机制的实现是非常重要的一部分,用来处理应用程序的各种事件,例如监听窗口尺寸、鼠标单击等等。
Java中提供了许多类来实现这个目的,其中一种类就是监听器(Listener)。
本文将介绍Java监听器实现原理,并结合实例进行详细讲解。
1、什么是Java监听器?Java监听器是一种事件回调机制,用于处理事件驱动的机制。
Java监听器使得可以将事件的逻辑处理代码作为方法放置于监听器接口中,当事件被触发时,监听器接口的方法就会被调用。
主要作用在于对某些程序对象的变化或者状态进行监听,以便于程序对这些变化或者状态进行响应和处理。
2、Java监听器的实现步骤2.1、定义监听器接口Java监听器实现首先要定义一个监听器接口,接口名通常以Listener结尾,其中定义了事件处理方法。
例如,在Java程序中定义一个用于监听按钮事件的ButtonListener接口:```public interface ButtonListener {public void buttonClicked(ButtonEvent e);}```2.2、定义事件类在Java程序中,通常使用事件对象来传递事件信息,因此需要定义事件类。
事件类包含了监听器接口对象,以便于在事件发生时调用接口方法。
例如,在Java程序中定义一个事件类ButtonEvent:```public class ButtonEvent {private Button source;public ButtonEvent(Button source) {this.source = source;}public Button getSource() {return source;}}```2.3、定义事件源事件源类是触发事件的对象,通常是一个控件或一个对象。
事件源类包含了对监听器接口的引用,以便于在事件发生时通知监听器。
oracle监听配置方法
1.ORACLE监听服务配置步骤第一步,在系统开始菜单下找到oracle安装目录,找到监听配置工具第二步:弹出界面,选择监听程序配置项,然后点击下一步,第三步:弹出界面选择重新配置,然后点击下一步,第四步:弹出监听配置界面,如下图所示:选择默认的监听,然后点击下一步,第五步,弹出是否要修改监听界面,选择是,点击下一步,第六步,弹出监听配置界面,选择TCP协议,如下图所示,点击下一步,第七步,弹出端口设置界面,选择默认的1521端口号,点击下一步,如下图所示:第八步,弹出是否配置另一个监听程序设置界面,选择否,点击下一步,如下图所示:第九步,弹出界面提示监听配置完成,如下图所示,继续点击下一步,第十步,弹出配置完成界面,点击完成,即可完成监听配置(如果没配置成功,继续从此界面开始上述各步骤配置监听),如下图所示:第十步,启动监听服务,点击右键我的电脑,选择管理,如下图所示第十一步,弹出计算机管理界面,选择服务table页面,在电脑右边可以看到相应的服务,如下图所示:第十二步,找到oracle的监听服务名OracleOraDb11g_home1TNSListener,选择启动或者重启动操作,监听服务即可重启。
2. 验证Oracle监听服务是否启动成功步骤(配置网络服务连接信息)第一步,在系统开始程序中选择oracle安装程序目录的服务服务配置工具,如下图所示:第二步,弹出配置界面,选择第三项,如下图所示,点击下一步,第三步,弹出如下界面,选择添加,点击下一步,第四步,弹出如下界面,在服务名栏中填入对应的服务名,一般是orcl,点击下一步,第五步,弹出如下界面,选择对应的TCP协议,点击下一步,第六步,弹出如下界面,选择刚才监听配置的端口号,一般监听配置默认端口号1521,我们选择默认的端口号(注意这个一定要选择与监听配置的一样),接着在主机名栏内填入机器的设置IP,或者填127.0.0.1,填完之后,点击下一步。
Windows服务监听程序
目录Part One:函数组件实现 (1)Part two:安装/卸载/调用服务主程序,Main函数入口 (9)Part Three:头文件,平台/浏览器使用版本宏定义 (10)Part Four:头文件,函数组件声明 (10)Part One:函数组件实现TCHAR g_szServieName[] = TEXT("HookService");//服务名称TCHAR g_szServieDescription[] = TEXT("The Service Of HookProgram");//服务描述SERVICE_STATUS g_svrStatus;//服务状态SERVICE_STATUS_HANDLE g_hStatus;DWORD g_errCode = 0;HANDLE g_eventWait = NULL;DWORD waitID = 0; // 监控Token插拔的线程的IDHANDLE waitHD = NULL; // 监控Token插拔的线程的句柄//P11_CONTEXT g_p11Ctx; // PKCS#11库的全局上下文//*************************************************************************************************** *************************//编译生成可执行程序的绝对路径函数BOOL FindExePath(TCHAR* Path){if ( !GetModuleFileName(NULL, Path, MAX_PATH) ) {printf_s("Get ExeFile Failed. error code = %d\n", GetLastError());return FALSE;}return TRUE;}DWORD WINAPI waitThreadProc(LPVOID lpParameter) {waitID=0;return 0;}//启动服务int StartMoniter() {//InitP11Context(NULL/*&g_p11Ctx*/, ReadStartupDir, TRUE);// 创建Key插拔监视线程,监key的状态(插拔),保存该线程句柄waitHD = CreateThread(NULL, // SECURITY_ATTRIBUTES结构指针,可以为NULL0, // 初始的栈大小,此处为,使用缺省大小(LPTHREAD_START_ROUTINE)waitThreadProc, // 线程函数和线程启动地址NULL,//&g_p11Ctx, // 将p11库的函数列表指针作为参数传递CREATE_SUSPENDED, // 创建标志为CREATE_SUSPENDED,不立即运行&waitID // 线程标识由waitID返回);// 启动创建好的key监控线程ResumeThread(waitHD);//激活线程return 0;}BOOL Run() {SERVICE_TABLE_ENTRY DispatchTable[] = {{ g_szServieName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },{ NULL, NULL } // 最后一个元素必须为{NULL, NULL}};// 将服务进程的主线程连接到服务控制管理器SCMreturn StartServiceCtrlDispatcher(DispatchTable);}BOOL InstallService(){TCHAR FilePath[MAX_PATH+1];ZeroMemory(FilePath,MAX_PATH);// 首先获取服务可执行程序的绝对路径FindExePath(FilePath);// 建立与服务控制管理器(SCM)的连接SC_HANDLE hSCManager;hSCManager = OpenSCManager(NULL, // 目标主机名,此处为NULL,本机NULL, // 数据库名,缺省为SERVICES_ACTIVE_DATABASE(参数NULL)SC_MANAGER_ALL_ACCESS // 访问权限);if ( hSCManager == NULL ) {printf_s("OpenSCManager failed, error code = %d\n", GetLastError());return FALSE;}// 创建一个服务对象并将其增添到服务控制管理器(SCM)的数据库中SC_HANDLE hService;hService = CreateService(hSCManager, // 连接句柄,代表一个SCM数据库g_szServieName, // 服务名g_szServieName, // 服务显示名SERVICE_ALL_ACCESS, // 服务访问权限// 服务类型:// SERVICE_WIN32_OWN_PROCESS表示独立进程// SERVICE_INTERACTIVE_PROCESS表示服务能与桌面交互SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START, // 启动选项,此处为自动启动SERVICE_ERROR_NORMAL, // 错误处理FilePath, // 服务可执行文件的路径NULL, // 服务组,为NULL则表示此服务不属任何组NULL, // 服务组中的唯一标签NULL, // 服务依赖项NULL, // 服务启动帐户NULL // 服务启动帐户的口令);if ( hService == NULL ) {CloseServiceHandle(hSCManager);printf_s("create service failed, error code = %d\n", GetLastError());return FALSE;}// 更改刚创建的服务的描述字符串SERVICE_DESCRIPTION sd = {0};sd.lpDescription = g_szServieDescription;ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &sd);// 清理并返回CloseServiceHandle( hService );CloseServiceHandle( hSCManager );return TRUE;}BOOL UnInstallService(){// 打开SCM数据库SC_HANDLE hSCManager;hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if ( hSCManager == NULL ) {printf_s("OpenSCManager failed, error code = %d\n", GetLastError());return FALSE;}// 打开指定名称的服务SC_HANDLE hService;hService = OpenService(hSCManager, // SCM数据库连接g_szServieName, // 服务名SERVICE_ALL_ACCESS // 访问权限);if ( hService == NULL ) {printf_s("OpenService failed, error code = %d\n", GetLastError());return FALSE;}// 首先停止服务SERVICE_STATUS ss = {0};if ( !ControlService(hService, // 打开的服务SERVICE_CONTROL_STOP, // 控制码&ss // 控制的返回状态) ) {printf_s("ControlService failed, error code = %d\n", GetLastError());}// 删除服务if ( !DeleteService(hService) ) {printf_s("DeleteService failed, error code = %d\n", GetLastError());return FALSE;}else printf_s("Service deleted successfully\n");// 清理并返回CloseServiceHandle(hService);CloseServiceHandle(hSCManager);return TRUE;}VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv) {// 首先填充SERVICE_STATUS结构g_svrStatus.dwServiceType = SERVICE_WIN32; // 服务类型g_svrStatus.dwCurrentState = SERVICE_START_PENDING; // 服务状态为待启动g_svrStatus.dwControlsAccepted = //SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; // 允许的控制g_svrStatus.dwWin32ExitCode = //ERROR_SERVICE_SPECIFIC_ERROR; // 用来报告启动或停止错误的错误码g_svrStatus.dwServiceSpecificExitCode = 0; // 服务特定的错误码,dwWin32ExitCode为/////////////////////////////////////////////////////// ERROR_SERVICE_SPECIFIC_ERROR被忽略g_svrStatus.dwCheckPoint = 1; // 执行长之间操作时报告状态的周期g_svrStatus.dwWaitHint = 2000; // 等待启动、停止等操作的时间限制,单位为毫秒// 注册服务状态改变时的回调函数DWORD dwWait;g_hStatus = RegisterServiceCtrlHandlerEx(g_szServieName, // 服务名称ServiceCtrlHandlerEx, // 回调函数的地址&dwWait // 传递给回调函数的用户自定义数据的地址);if ( g_hStatus == SERVICE_STATUS_HANDLE(NULL) ) {printf_s("RegisterServiceCtrlHandler failed, error code = %d\n", GetLastError());return;}// 更新SCM中的状态信息,若失败向SCM报告if ( !SetServiceStatus(g_hStatus, &g_svrStatus) ) {printf_s("SetServiceStatus pending failed, error code = %d\n", GetLastError());ReportStatusToSCMgr(SERVICE_STOPPED, g_errCode, 0);return;}// 创建一个事件对象,若失败向SCM报告g_eventWait = CreateEvent(NULL, // 指向SECURITY_ATTRIBUTES结构的指针,此处为NULL,此句柄不能被子进程继承TRUE, // 参数TRU表示创建一个手工重置的事件对象,该对象需调用ResetEvent函数清除FALSE, // FALSE表示新建的事件对象没有信号(signalel)NULL // 事件对象的名称,为NULL表示匿名对象);if ( g_eventWait == NULL ) {printf_s("CreateEvent failed, error code = %d\n", GetLastError());ReportStatusToSCMgr(SERVICE_STOPPED, g_errCode, 0);return;}// 启动服务主体函数StartMoniter();// 报告服务启动成功if ( !ReportStatusToSCMgr(SERVICE_RUNNING, NO_ERROR, 2) ) {printf_s("ReportStatusToSCMgr failed, error code = %d\n", GetLastError());ReportStatusToSCMgr(SERVICE_STOPPED, g_errCode, 0);return;}// 等待事件对象上的信号dwWait = WaitForSingleObject(g_eventWait, // 等待的对象是前面建立的事件对象INFINITE // 没有期限);// 事件上有信号发生,清理并退出服务主函数if ( g_eventWait != NULL ) CloseHandle(g_eventWait);if ( g_hStatus != NULL ) ReportStatusToSCMgr( SERVICE_STOPPED, g_errCode, 0);}DWORD WINAPI ServiceCtrlHandlerEx(DWORD control, DWORD eventType, LPVOID lpEnentData, LPVOID lpContext) {DWORD dwState = SERVICE_RUNNING;switch (control) {case SERVICE_CONTROL_PAUSE: // 控制码为暂停服务if ( g_svrStatus.dwCurrentState == SERVICE_RUNNING ) { // 服务运行//PauseService();dwState = SERVICE_PAUSED;}break;case SERVICE_CONTROL_CONTINUE: // 控制玛为服务继续if (g_svrStatus.dwCurrentState == SERVICE_PAUSED ) {//ResumeService();dwState = SERVICE_RUNNING;}break;case SERVICE_CONTROL_SHUTDOWN: // 控制码为主机关机case SERVICE_CONTROL_STOP : // 控制码为停止服务dwState = SERVICE_STOP_PENDING;(VOID)ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 1); // 报告新状态SetEvent(g_eventWait); // 在等待事件上产生信号return 0;case SERVICE_CONTROL_INTERROGATE: // 控制码为质询break;default :break;}(VOID)ReportStatusToSCMgr(dwState, NO_ERROR, -1);return 0;}BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwCheckPoint) {BOOL fResult;if ( dwCurrentState == SERVICE_START_PENDING ) g_svrStatus.dwControlsAccepted = 0;else g_svrStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;if ( dwCurrentState >= 0 ) g_svrStatus.dwCurrentState = dwCurrentState;g_svrStatus.dwWin32ExitCode = dwWin32ExitCode;if ( dwCheckPoint < 0 ) g_svrStatus.dwCheckPoint++;else g_svrStatus.dwCheckPoint = dwCheckPoint;// 设置服务状态if ( !(fResult = SetServiceStatus(g_hStatus, &g_svrStatus)) )StopService(TEXT("SetServiceStatus"));return fResult != 0;}void StopService(LPTSTR lpszMsg) {TCHAR chMsg[256];HANDLE hEventSource;LPTSTR lpszStrings[2];g_errCode = GetLastError();// 取得服务上的事件日志并生成日志文本hEventSource = RegisterEventSource(NULL, g_szServieName);_stprintf_s(chMsg, 256, TEXT("%s error:%d"), g_szServieName, g_errCode);lpszStrings[0] = chMsg;lpszStrings[1] = lpszMsg;// 在指定的事件日志中加入记录if ( hEventSource != NULL ) {ReportEvent(hEventSource, // 事件日志的句柄EVENTLOG_ERROR_TYPE, // 写入日志的事件类型,此处为错误0, // 事件分类,于事件源相关,可以为任意值0, // 事件标识NULL, // 用户的安全识别2, // lpStrings参数中字符串的个数0, // 事件相关数据的大小,字节为单位(LPCTSTR*)lpszStrings, // lpStrings,用来拼装服务消息的字符串数组NULL // 事件相关的二进制数据指针);// 关闭事件日志写入句柄(VOID)DeregisterEventSource(hEventSource);}if ( waitHD ) TerminateThread(waitHD, 0);// ClearP11Context(&g_p11Ctx);// 在全局事件上产生一个信号SetEvent(g_eventWait);}***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** *****************************************************************************************************Part two:安装/卸载/调用服务主程序,Main函数入口#define CountPra_zero 0#define CountPra_one 1#define CountPra_two 2void ShowUseFun(int argc, char** argv){printf("\tService Install&Uninstall Info:\n");printf("\tInstall Service:");printf("\t %s --install\n",argv[CountPra_zero]);printf("\tUnInstall Service:");printf("\t %s --uninstall\n",argv[CountPra_zero]);}int main(int argc,char* argv[]){if(CountPra_two==argc){if(strcmp(argv[CountPra_one],"--install")==CountPra_zero)InstallService();else if(strcmp(argv[CountPra_one],"--uninstall")==CountPra_zero)UnInstallService();else{printf("Input Error!\n");ShowUseFun(argc, argv);}}else if(CountPra_one==argc)Run();//ShowUseFun(argc, argv);elseShowUseFun(argc, argv);return 0;}Part Three:头文件,平台/浏览器使用版本宏定义#pragma once// 以下宏定义要求的最低平台。
listener工作原理
listener工作原理listener(监听器)是计算机网络中的一个重要概念,它是一种用于监控和接收特定事件或消息的程序组件。
listener的工作原理是通过不断监听指定的端口或通道,以便及时捕获和处理相关的数据。
listener的工作原理可以简单概括为以下几个步骤:首先,listener需要在特定的网络端口或通道上进行监听。
这个端口或通道通常是与特定应用程序或服务相关联的,例如Web服务器的80端口或FTP服务器的21端口。
listener会通过网络协议(如TCP/IP)与操作系统进行通信,请求将特定端口或通道分配给自己。
一旦listener成功绑定到指定的端口或通道上,它就会开始不断地监听来自该端口或通道的数据流。
这些数据流可以是用户请求、网络消息、传感器数据等等,具体取决于listener所监控的对象。
当listener接收到数据流时,它会根据预先设定的规则或条件对数据进行解析和处理。
这些规则可以是简单的过滤器,也可以是复杂的算法。
listener会根据这些规则判断数据的类型、有效性和目标,并将其分发给相应的处理程序或模块。
在将数据分发给处理程序或模块之前,listener可能还会对数据进行一些预处理操作。
例如,它可以对数据进行解密、解压缩、格式转换等操作,以确保数据能够被后续的处理程序正确处理。
最后,listener将数据传递给相应的处理程序或模块进行进一步的处理。
这些处理程序可以是业务逻辑、数据存储、用户界面等等,它们会根据具体的需求对数据进行相应的操作和处理。
需要注意的是,listener的工作原理是一个循环的过程。
它会不断地监听、接收、解析和分发数据,以保证数据的及时处理和响应。
同时,listener还需要具备一定的容错能力,能够处理异常情况和错误数据,以确保系统的稳定性和可靠性。
总结起来,listener的工作原理是通过监听特定的端口或通道,接收并处理相关的数据流。
它通过预先设定的规则和条件对数据进行解析和分发,将数据传递给相应的处理程序或模块进行进一步的操作和处理。
使用winpcap库打造网络端口监听程序
即主机 A 的 ARP 缓存中存有主机 B 的 IP-MAC 映射,主机 B 的 ARP 缓存中存有主机 A 的 IP-MAC 映射。主机 A 与 B 可以正常通信,现在主机 C 伪造一个 ARP 广播包,发给主机 A,广播包主 要内容如下:
读到这里,有的朋友可能会问,如果这个列表里面没有我们要的地址映射该怎么办呢, 那么我们就继续实验,找一个列表中没有的地址,和它通信,比如我们选择 IP 为 222.26.193.20 的主机,在 dos 窗口中输入 ping 222.26.193.20 那么电脑会向局域网发送 ARP 广播包,询问 222.26.193.20 对应的 MAC 地址,网络中每台电脑都会收到这个请求包, 但是它们发现 222.26.193.20 并非自己,就不会做出相应,而主机 222.26.193.20 就会给我 们的电脑回复一个 ARP 应答包,告诉我们它的 MAC 地址是 00-13-a9-44-13-25,于是我们电 脑的 ARP 缓存就会相应刷新,多了这么一条:
容,提取源 MAC、目的 MAC、源 IP、目的 IP、所使用的协议,以及 ARP 攻击检测等内容。 软件截图如下:
本文是我辛苦了 3 个礼拜的结果,如要转载,请指明原作者及出处,谢谢哈!^_^ 如对本
篇文章有不解的地方可以随时联系我,共同探讨问题。
Email:zp_sun@
下面我将具体介绍一下需要的理论知识以及 NIM 的实现方法。
一、ARP 协议m?fr=ala0 ,以下是我结合了资料后的理解:
以太网设备比如网卡都有自己全球唯一的 MAC 地址,也就是我们经常说的“物理地址”, 是一个 48 位的二进制代码。MAC 地址是厂家生产的时候就固化在设备上的。网卡是以 MAC 地 址来传输以太网数据包的,但是它们却识别不了我们 IP 包中的 IP 地址,所以我们在以太网 中进行 IP 通信的时候就需要一个协议来建立 IP 地址与 MAC 地址的对应关系,以使数据包能 发到一个确定的地方去。这就是 ARP(Address Resolution Protocol,地址解析协议)。
linux建立监听
1.修改配置文件:[oracle@bogon admin]$ cd $ORACLE_HOME/network/admin [oracle@bogon admin]$ lslistener.ora samples shrept.lst tnsnames.ora[oracle@bogon admin]$ vi listener.ora重点修改SID_NAME = “” , “”的内容为数据的实例。
HOST = “”, “”的内容为本地主机的IP地址[oracle@bogon admin]$ vi tnsnames.oraSERVICE_NAME=“”,””内容为全局数据库名HOST=“”,“”的内容为本地的IP地址. 使用oracle用户登录,执行如下命令:[oracle@localhost ~]$ cd $ORACLE_HOME/bin[oracle@localhost ~]$./netca (运行创建监听程序,如下图)1.1选择监听程序配置,点击下一步,如下图:1.2选择添加,点击下一步,如下图:下图:1.4选定协议为TCP协议,点击下一步继续,如下图:1.5选择使用标准端口号1521,点击下一步继续,如下图:1.6选择否,点击下一步继续,如下图:1.7监听程序配置完成,点击下一步继续,如下图:到此,监听程序配置已完成,点击完成按钮结束该操作。
3.创建数据库用户并赋予权限;[oracle@bogon ~]$ sqlplus /nologSQL> conn /as sysdbaSQL> startupSQL> create user oracle identified by "123456";创建用户及密码SQL> grant dba to oracle; 授予用户管理权限。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2005年07月15日 作者:佚名 责任编辑:moningfeng
文章导读:上网的时候很容易遭到探测,一般探测你个人的入侵者技术不会高明到哪里去。所以根本不能称上黑客,所以本文就用入侵者来代替。他们对普通网民的扫描可以是多端口单IP的扫描或者多IP单端口扫描。前者是通过一些IP工具来取得你的IP,然后尝试利用端口扫描获取你的信息,看你的计算机有没有预先中了木马。然后通过网上的木马端口列表,来获得木马名称。用相应的客户端软件来连接到你的计算机。从而获得密码、以及你的秘密信息。后者则是通过利用如SuperScan等可以大范围扫描IP的软件,扫描打开特定端口的机器。比如,可以扫描打开7626端口的机器,看对方是否中了冰河。然后,入侵者就用客户端连接到服务器从而入侵你的计算机。
Load Winsock2(NOW_OUT) ''加载建立连接的Winsock2数组控件
Winsock2(NOW_OUT).Accept requestID ''建立连接
Winsock1(Index).Close
Winsock1(Index).Listen ''Winsock1继续监听
NOW_OUT = NOW_OUT + 1 ''连接的控件累加
Next i
For i2 = 1 To Winsock2.Count - 1
Unload Winsock2(i2)
Next i2
Command2.Caption = "监听"
End If
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
‘本程序在VB6.0+Windows2000下测试通过!
Dim tmpstr As String
Dim NOW_OUT As Integer ''总共出去连接的有几个Winsock
Private Sub Command1_Click()
ListPorts.AddItem txtADDPORT.Text
因为不可能一个端口只有一个人会扫描,所以本程序我们需要使用到控件数组。这个概念的描述大家可以查找MSDN。本程序的流程是:
1、 定义需要监听的端口
2、 装载一定数量的Winsock1控件,从需要监听的端口列表中获得数据。一一开启监听功能。(Listen)
3、 当某一个控件接收到连接的事件发生,就把得到的RemoteIP和LocalPort加入日志
这些扫描是简单的TCP的Connect扫描。所以无法避开防火墙的追踪。网民就可以利用天网等防火墙软件来获取对方的IP。相信很多DIY迷或者编程爱好者总是想拥有属于自己的类似的工具。本文就给你讲述如何用VB来获得探测你的入侵者的IP地址,然后……我可没有教你用蓝屏炸弹或者蜗牛炸弹去炸它哦。毕竟,我们没有入侵者的野心,本程序还可以让你监听80端口,来察看对方对你进行的常规扫描。要看懂本文,你需要有一定的VB基础。
Private Sub Form_Load()
txtLOG.Text = "日志:" & vbCrLf
NOW_OUT = 1
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
上网的时候很容易遭到探测,一般探测你个人的入侵者技术不会高明到哪里去。所以根本不能称上黑客,所以本文就用入侵者来代替。他们对普通网民的扫描可以是多端口单IP的扫描或者多IP单端口扫描。前者是通过一些IP工具来取得你的IP,然后尝试利用端口扫描获取你的信息,看你的计算机有没有预先中了木马。然后通过网上的木马端口列表,来获得木马名称。用相应的客户端软件来连接到你的计算机。从而获得密码、以及你的秘密信息。后者则是通过利用如SuperScan等可以大范围扫描IP的软件,扫描打开特定端口的机器。比如,可以扫描打开7626端口的机器,看对方是否中了冰河。然后,入侵者就用客户端连接到服务器从而入侵你的计算机。
Command1 command Caption=”添加”
Command2 command Caption=”监听”
Command3 command Caption=”退出”
Listports Listbox 无
TxtLog Richtextbox 无
程序的代码以及说明如下:
Winsock2(Index).GetData tmpstr ''通过Getdata捕获数据
myAddLog "来自" & Winsock2(Index).RemoteHostIP & "的数据:" & tmpstr ''显示捕获的数据
End Sub
Sub myAddLog(tmptext As String) ''加入日志
好了,废话少说,我们ቤተ መጻሕፍቲ ባይዱ看看本程序的基本原理:
入侵者通过Connect本机的端口,然后通过是否成功,来获得信息。由于TCP的三次握手原理。他必定会留下自己的IP,我们就利用这一个原理来获得对方的IP。
Winsock控件的属性、方法和事件在我上次写的《.用winsock制作漏洞扫描器》一文中已经叙述过,这里就不再介绍。大家还一定记得RemoteHostIP和LocalPort属性吧。这就是对方的IP和自己的端口。聪明的你应该明白了吧。通过这两个属性就可以清楚的获得对方的IP地址和他正在扫描的本地端口。
Winsock1(i + 1).LocalPort = ListPorts.List(i) ''设定端口
Winsock1(i + 1).Listen ''监听
Next i
Command2.Caption = "停止"
Else
For i = 1 To Winsock1.Count - 1
Unload Winsock1(i)
tmptext = tmptext & vbCrLf
txtLOG.SelStart = Len(txtLOG.Text)
txtLOG.SelText = tmptext
End Sub
总结:其实一些程序的原理很简单,我们只要善于实践,并且能够把所学的只是运用到你的程序中去,我想编出类似的程序是很简单的。如木马、端口扫描器、客户端工具、CGI漏洞扫描器……。VB的Winsock控件虽说不是底层操作。及不上C语言的Socket编程的功能。但实现普通的操作还是很有用的。简单的例子就是Cookie欺骗,用VB来编写这种程序十分简单。
myAddLog "来自" & Winsock1(Index).RemoteHostIP & "连接到本地端口:" & Winsock1(Index).LocalPort
''显示捕获的连接
End Sub
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
4、 加载一个Winsock2,继续捕获数据(Getdata)
5、 Winsock2数据到达记录数据
程序的基本概念都介绍完了,相信你对本程序已经有了一定的认识。现在我们就来开始我们的工作:
程序的控件以及说明如下:
控件名 控件类型 属性
Label1 Label Caption=”增加端口”
End Sub
Private Sub Command2_Click()
On Error Resume Next
If Command2.Caption = "监听" Then
For i = 0 To ListPorts.ListCount - 1
Load Winsock1(i + 1) ''加载监听端口的winsock1数组控件