e4a 分配或e4a调用系统应用语句 的代码怎么写

查看: 2781|回复: 5
【新人求助】接口服务达到常驻后台
主题帖子积分
初级会员, 积分 74, 距离下一级还需 126 积分
初级会员, 积分 74, 距离下一级还需 126 积分
本帖最后由 Wuifan 于
12:04 编辑
原帖地址:()
求助大神,我把“后台服务”,“启动服务()”,“停止服务()”接口名修改成英文还是编译不成。
如果还有能用的常驻后台防止被清理的方法当然是求之不得啦
编译中出错:
&font color=&#2e8b57&&正在编译代码:后台服务
正在编译代码:MyService&/font&
正在生成文件:R.java
正在执行操作:抽取编译所需组件
正在编译代码:主窗口代码
&font color=&#ff0000&&错误:主窗口代码:第3行:未找到标识符 启动服务
错误:主窗口代码:第3行:需要分配或调用语句
错误:主窗口代码:第6行:未找到标识符 停止服务
错误:主窗口代码:第6行:需要分配或调用语句
错误个数:4&/font&复制代码两个接口:1、Myservice
package com.e4a.runtime.//包名必须固定为这个,不能自己修改
import android.app.S
import android.os.IB
import android.content.I
import android.widget.T
& & public class MyService extends Service {
& & @Override
& & public IBinder onBind(Intent arg0) {//不用管,写上就是了
& && &&&
& & }
& & @Override
& & public void onCreate() {//当服务被创建时该方法被调用
& && && && &Toast.makeText(this, &服务创建成功!&, Toast.LENGTH_SHORT).show();&&
& & }
& & @Override
& & public void onDestroy() {//当服务被销毁时该方法被调用
& && && && &Toast.makeText(this, &服务被销毁。&, Toast.LENGTH_SHORT).show();&&
& & }
& & @Override
& & public void onStart(Intent intent, int startId) {//当服务开始时该方法被调用
& && && && &Toast.makeText(this, &服务运行中...&, Toast.LENGTH_SHORT).show();&&
& & }
}复制代码2、后台服务
package com.e4a.runtime.//包名必须固定为这个,不能自己修改
import com.e4a.runtime.annotations.SimpleF
import com.e4a.runtime.annotations.SimpleO
import com.e4a.runtime.annotations.UsesP
import com.e4a.runtime.android.mainA
import android.content.I
import android.widget.T
@SimpleObject
public final class 后台服务{
& & @SimpleFunction//导出函数标记
& & public static void 启动服务(){//启动后除非手动结束,就算窗口被销毁,程序被结束,服务也不会被结束
& && &&&Intent intent = new Intent(&com.e4a.runtime.api.myService&);
& && && & mainActivity.getContext().startService(intent);
& & }
& & @SimpleFunction//导出函数标记
& & public static void 停止服务(){
& && &&&Intent intent = new Intent(&com.e4a.runtime.api.myService&);
& && && & mainActivity.getContext().stopService(intent);
& & }
}复制代码
11:57 上传
点击文件名下载附件
10.66 KB, 下载次数: 312
主题帖子积分
初级会员, 积分 74, 距离下一级还需 126 积分
初级会员, 积分 74, 距离下一级还需 126 积分
怎么没人啊啊啊!
http://www.wxhzc.com/b/LcHOhQs0LcH/ 重生之政道风流&
主题帖子积分
........................我也急求
主题帖子积分
高级会员, 积分 542, 距离下一级还需 458 积分
高级会员, 积分 542, 距离下一级还需 458 积分
是啊,难道这个只有曲线救国么,就没有直接常驻的方法或属性么
主题帖子积分
初级会员, 积分 98, 距离下一级还需 102 积分
初级会员, 积分 98, 距离下一级还需 102 积分
这里没有高手吗,一个好贴没有人回。而且E4A极度不稳定,就向用户收费了,假得要命,易语言里面的返回()命令,再e4a里面怎么表达,怎样写_百度知道
易语言里面的返回()命令,再e4a里面怎么表达,怎样写
易语言里面的返回()命令,再e4a里面怎么表达,意思就是说在e4a里面用这个命令让代码停止往下执行,不知道怎样写,求好心人解答
我有更好的答案
在微处理器 执行代码 是不会 停止执行的,可以让指令 循环执行,一种是 条件循环(当满足一个条件跳出循环 或者 不满足条件 跳出循环),还有就是无条件循环(就是死循环 一般不会用死循环),可以用个 条件循环代码(如定时 或者触发 跳出循环)。
采纳率:60%
或许可以调试输出()
只能做一个判断,e4a和易语言各有各的写法,不一样的
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。(window.slotbydup=window.slotbydup || []).push({
id: '2014386',
container: s,
size: '234,60',
display: 'inlay-fix'
&&|&&0次下载&&|&&总168页&&|
ECSHOP开发技巧、设置说明、二次开发要点。
您的计算机尚未安装Flash,点击安装&
阅读已结束,如需下载到电脑,请使用积分()
下载:60积分
相关分类推荐
0人评价34页
0人评价2页
0人评价22页
0人评价4页
0人评价23页
所需积分:(友情提示:大部分文档均可免费预览!下载之前请务必先预览阅读,以免误下载造成积分浪费!)
(多个标签用逗号分隔)
文不对题,内容与标题介绍不符
广告内容或内容过于简单
文档乱码或无法正常显示
文档内容侵权
已存在相同文档
不属于经济管理类文档
源文档损坏或加密
若此文档涉嫌侵害了您的权利,请参照说明。
我要评价:
价格:60积分VIP价:48积分易安卓中文编程软件|易安卓(E4A)5.2 官方最新版【附视频教程】-东坡下载
东坡下载:内容最丰富最安全的下载站!
→ 易安卓(E4A) 5.2 官方最新版【附视频教程】
安卓开发的朋友应该对易安卓(E4A)非常熟悉,这是基于谷歌Simple语言的应用开发工具,能帮助安卓开发者轻松编写安卓应用,小编这里带来的是易安卓(E4A)官方5.2最新版,还附上了详细的视频教程,欢迎下载!易安卓(E4A)功能介绍定位于为企业、站长、开发者、网络公司、各种手持设备等等基于安卓系统下的APP开发的全中文安卓编程语言,本语言的安卓APP代码编写非常符合国人的编程思维习惯,能使国人极易上手。E4A 最终将会发展成为全球首款应用简单功能强悍的全中文 Android APP 开发语言。易安卓(E4A)视频教程易安卓(E4A)相关说明易安卓,以下简称E4A,是一个基于谷歌Simple语言的编程工具,旨在实现通过类似易语言的Basic语法轻松编写Android应用程序。只要你有易语言的基础,就可以很轻松上手。E4A拥有和易语言一样的可视化开发环境,以及强大的智能语法提示功能。纯中文编写代码,比英文更具亲和力,您也无需为记不住英文关键词而烦恼。E4A已经内置了Android1.5开发包SDK,您只需额外下载安装Java1.6开发包JDK即可。目前E4A还处于初级阶段,我们将继续完善她,立志把E4A打造成最简单易用的中文!E4A的QQ网络验证失败的问题解决方案网络验证失败一般是几个情况:1、你本机的QQ是无盘系统分配的(也就是你在网吧)2、快速登录功能损坏3、QQ版本太低第一种情况,直接去QQ官方网下载一个QQ安装就可以了。第二种就安装一下快速登录插件即可。第三种升级下QQ即可。快速登录插件下载地址:http://dldir1.qq.com/qqfile/qq/pic/TXSSOSetup.exe(下载直接打开几次就可以了,该插件不会显示程序界面的)另外附一个检测网址:http://ui.ptlogin2.qq.com/assistant/troubleshooter.htmlXP系统中E4A经常崩溃的解决办法如果在XP系统中使用E4A经常遇到崩溃的问题,请将E4A设置为98兼容模式运行,可以极大减少崩溃的概率。但是使用兼容模式的副作用也很大,所以还是建议尽快升级系统到win7或win7以上的系统,可有效解决崩溃的问题。E4A支付宝组件的私钥配置教程1、下载本教程的附件,解压到桌面打开\bin目录下的openssl.exe2、输入genrsa -out rsa_private_key.pem 1024生成私钥。3、接着输入rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem生成支付宝公钥。4、最后,输入pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt将私钥转成pkcs8格式,如下图:5、鼠标移动到窗口上点击右键 编辑&标记。将私钥标记上,再点编辑&复制。新建一个文本将复制下来的私钥粘贴上,去除所有的换行符和空格,使其成为一行,粘贴进E4A里面就可以使用了(PS:注意,-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----这两行要删除掉,不需要)6、最后一步,将之前生成的支付宝公钥文件 (rsa_public_key.pem) 用txt打开。同样的去除所有的换行符和空格,使其成为一行。(PS:注意,-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----这两行要删除掉,不需要)7、打开支付宝商户版http://b.alipay.com,登录点击我的商家服务,点查询PID、KEY,看合作伙伴密钥管理的RSA加密,添加密钥并且保存。至此,E4A支付宝移动支付配置完毕。说这么详细还看不懂话,有两个解决办法:从头再看一遍or回家种田!(如果开始支付的时候崩溃,就是私钥没弄好。另外,需要配置服务端回调的可联系小李哥QQ。安全性提高99.99%。付费服务)易安卓(E4A)5.2更新内容1、升级android SDK为6.0版(API-23);2、时间操作类增加“取指定时间戳”命令;3、由于编辑框的被单击事件会影响输入法按下“下一个”按键时自动移动焦点到下一个编辑框,故取消了对被单击事件的监听响应,如需要响应此事件,请调用“监听被单击事件”命令;4、工具菜单中增加了一个“背景图形制作器”工具,用于制作按钮、编辑框、高级菜单等组件的背景图形的xml配置文件,用这种xml配置文件做背景图形,比一般的图片体积更小,效果更好;5、更新了网络操作类的“百度翻译”命令,请到百度翻译开放平台申请APPID和秘钥后再使用;6、res图片资源增加对drawable-hdpi类图片资源的支持,可以在图片资源窗口里的组合框中进行选择;7、高级例程增加一个《52、水波纹特效例程》,运用xml配置文件设置按钮被单击时的水波纹特效;8、类库开发工具的属性设置中增加支持添加权限信息的功能,方便大家直接把所需权限复制进去;
安卓官方手机版
IOS官方手机版
易安卓(E4A)截图
易安卓(E4A) 5.2 官方最新版【附视频教程】
本类最新软件
本类软件推荐
22.5M / 05-09 / v1.51 绿色版
852KB / 05-08 / 5.04 中文特别版
26M / 05-08 / 5.6官方版
7.4M / 05-05 / 2.1 最新版
30.7M / 05-04 / 7.1.0官方正式版
本类软件排行
本类软件必备
编程编译数据设计
请简要描述您遇到的错误,我们将尽快予以修正。
轮坛转帖HTML方式
轮坛转帖UBB方式下次自动登录
现在的位置:
& 综合 & 正文
今天搞定getch在linux下的实现
一般的终端模式下,使用的是('/n'), EOF, or EOL 这样一些结束符,可是在某些情况下,我们需要对某些键盘输入做响应,所以,采用的就是非经典模式终端,struct termios {tcflag_t c_ /* 输入模式旗标 */tcflag_t c_ /* 输出模式旗标 */tcflag_t c_ /* 控制模式旗标 */tcflag_t c_ /* 区域模式旗标 */cc_t c_ /* 行控制 (line discipline) */cc_t c_cc[NCCS]; /* 控制特性 */};
voidset_input_mode (void){
/* Make sure stdin is a terminal. */
if (!isatty (STDIN_FILENO))
fprintf (stderr, "Not a terminal./n");
exit (EXIT_FAILURE);
/* Save the terminal attributes so we can restore them later. */
tcgetattr (STDIN_FILENO, &saved_attributes);
atexit (reset_input_mode);
/* Set the funny terminal modes. */
tcgetattr (STDIN_FILENO, &tattr);
tattr.c_lflag &= ~(ICANON); /* Clear ICANON
tattr.c_cc[VMIN] = 1;
tattr.c_cc[VTIME] = 0;
tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);}
作者 omiga
| 人气(2) |
Linux中宏定义很多,而且又分散在各个头文件中,你可以预处理一下,比如 gcc -D__KERNEL__ -E console.c & console.i这样,console.c中的很多结构定义就在console.i中清晰的暴露了出来;有时可以用nm命令检查一下目标模块的包含的符号名,比如 nm console.o,这样可得知console.o引用了那些外部符号,它自已定义了哪些符号;另 一个方法是剖析运行中的系统.编绎内核产生的System.map文件非常重要,它包含了内核地址空间中各种符号名的地址,你可以用 System.map,结合源码,通过/dev/kmem检查内核中的各种数据结构,你也可以通过/dev/mem用物理地址来检查内存数据
作者 omiga
| 人气(1) |
编译都没有了问题。在加载模块时,出现了说printk这个符号无法解释的问题,与一般模式下相同,一定是这个printk找不到实现,原来是在kenel中有一个export table包含了所有kernel中可以使用的function,ksyms -a得到 c0216ba0 drive_info_R744aa133c01e4a44 boot_cpu_data_R660bd466c01e4ac0 EISA_bus_R7413793ac01e4ac4 MCA_bus_Rf48a2c4cc010cc34 __verify_write_R203afbeb 。。。入口对应的就是函数名,可是这个函数名太诡异了啊,其实这是一个版本号,来保证内核的稳定开发的,所以我们在使用printk时需要指定这个版本号,解决的办法:要嘛就是将 kernel 里的 set version 选项关掉,
#ifdef MODVERSIONS
#include &linux/modversions.h&
#endif 要嘛就是将 module compile 成 kernel 有办法接受的型式。这个办法可以使用宏替换不过何必呢。呵呵
#ifndef __KERNEL__#define __KERNEL__#endif
#include &/usr/src/linux-2.4.20-8/include/linux/version.h&
#ifndef MODULE#define MODULE#endif
#include &linux/module.h&#include &linux/kernel.h&#include &linux/init.h&
#ifdef MODVERSIONS
#include &linux/modversions.h&#endifstatic int __init init(void){
printk("&0&init/n");
return 0;}
static void __exit fini(void){
printk("&0&exit/n");}
module_init(init);module_exit(fini);MODULE_LICENSE("GPL");/* module.c */
INCLUDEDIR = /usr/src/linux-2.4.20-8/includeCC = gccLD = ldCFLAGS = -D__KERNEL__ -DMODULE -DMODVERSIONS -O -Wall -Wstrict-prototypes -I$(INCLUDEDIR)
VER = 2.4.20-8OBJS = hello.oall:$(OBJS)hello.o:hello.c$(CC) $(CFLAGS) -c $^ -o $@clean:rm -f *.orm -f core
作者 omiga
| 人气(2) |
Stun协议(Rfc3489、详见,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。举个实际例子(例1)来说明这四种NAT的区别: A机器在私网(192.168.0.4) NAT服务器(210.21.12.140) B机器在公网(210.15.27.166) C机器在公网(210.15.27.140) 现在,A机器连接过B机器,假设是 A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:8000)-& B(210.15.27.166:2000)。 同时A从来没有和C通信过。 则对于不同类型的NAT,有下列不同的结果: Full Cone NAT:C发数据到210.21.12.140:8000,NAT会将数据包送到A(192.168.0.4:5000)。因为NAT上已经有了192.168.0.4:.12.140:8000的映射。 Restricted Cone: C无法和A通信,因为A从来没有和C通信过,NAT将拒绝C试图与A连接的动作。但B可以通过210.21.12.140:8000与A的 192.168.0.4:5000通信,且这里B可以使用任何端口与A通信。如:210.15.27.166:2001 -&
210.21.12.140:8000,NAT会送到A的5000端口上。 Port Restricted Cone:C无法与A通信,因为A从来没有和C通信过。而B也只能用它的210.15.27.166:2000与A的192.168.0.4:5000通信,因为A也从来没有和B的其他端口通信过。该类型NAT是端口受限的。 Symmetric NAT: 上面3种类型,统称为Cone NAT,有一个共同点:只要是从同一个内部地址和端口出来的包,NAT都将它转换成同一个外部地址和端口。但是 Symmetric有点不同,具体表现在:只要是从同一个内部地址和端口出来,且到同一个外部目标地址和端口,则NAT也都将它转换成同一个外部地址和端 口。但如果从同一个内部地址和端口出来,是到另一个外部目标地址和端口,则NAT将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。而且 和Port Restricted Cone一样,只有曾经收到过内部地址发来包的外部地址,才能通过NAT映射后的地址向该内部地址发包。 现针对Symmetric NAT举例说明(例2): A机器连接过B机器,假使是 A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:8000)-& B(210.15.27.166:2000) 如 果此时A机器(192.168.0.4:5000)还想连接C机器(210.15.27.140:2000),则NAT上产生一个新的映射,对应的转换可 能为A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:8001)-& C (210.15.27.140:2000)。此时,B只能用它的210.15.27.166:2000通过NAT的210.21.12.140:8000 与A的192.168.0.4:5000通信, C也只能用它的210.15.27.140:2000通过NAT的210.21.12.140:8001 与A的192.168.0.4:5000通信,而B或者C的其他端口则均不能和A的192.168.0.4:5000通信。 通过上面的例子,我们清楚了Stun协议对NAT进行分类的依据。那么,我们现在根据上述分类标准(或例子),来简要分析一下iptables的工作原理(仅指MASQUERADE、下同),看看他又是属于哪种NAT呢? 首先,我们去网上下载一个使用Stun协议检测NAT的工具,网址在! iptables在转换地址时,遵循如下两个原则: 1、尽量不去修改源端口,也就是说,ip伪装后的源端口尽可能保持不变。(即所谓的Preserves port number) 2、更为重要的是,ip伪装后只需保证伪装后的源地址/端口与目标地址/端口(即所谓的socket)唯一即可。 仍以前例说明如下(例3): A机器连接过B机器,假使是 A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:5000)-& B(210.15.27.166:2000)。(注意,此处NAT遵循原则1、故转换后端口没有改变) 如 果此时A机器(192.168.0.4:5000)还想连接C机器(210.15.27.140:2000),则NAT上产生一个新的映射,但对应的转换 仍然有可能为A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:5000)-& C (210.15.27.140:2000)。这是因为NAT(转换后210.21.12.140:5000)-& B (210.15.27.166:2000)和NAT(转换后210.21.12.140:5000)-& C(210.15.27.140: 2000)这两个socket不重复。因此,对于iptables来说,这既是允许的(第2条原则)、也是必然的(第1条原则)。 在该例中,表 面上看起来iptables似乎不属于Symmetric NAT,因为它看起来不符合Symmetric NAT的要求:如果从同一个内部地址和端口出 来,是到另一个目标地址和端口,则NAT将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。相反,倒是符合除Symmetric NAT 外的三种Cone NAT的要求:从同一个内部地址和端口出来的包,NAT都将它转换成同一个外部地址和端口。加上iptables具有端口受限的属性 (这一点不容置疑,后面举反例证明之),所以好多检测工具就把iptables报告为Port restricted NAT类型了。 下面仍以前例接着分析(例4): 在前例中增加D机器在A同一私网(192.168.0.5) A机器连接过B机器,假使是 A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:5000)-& B(210.15.27.166:2000) D机器连接过C机器,假使是 D(192.168.0.5:5000)-& NAT(转换后210.21.12.140:5000)-& C(210.15.27.140:2000) 由iptables转换原则可知,上述两个转换是允许且必然的。 如 果此时A机器(192.168.0.4:5000)还想连接C机器(210.15.27.140:2000),则NAT上产生一个新的映射,但对应的转换 则变为A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:5001)-& C (210.15.27.140:2000)。这是因为,如果仍然将其转换为210.21.12.140:5000的话,则其所构成的socket (210.21.12.140:.27.140:2000)将和D-&C的socket一致,产生冲突,不符合 iptables的第2条原则(注意,此处以5001表示转换后不同的端口,但事实上,iptables却并不按照内部端口+1的原则来产生新的端口)。 在本例中我们注意到,从同一个内部地址和端口A(192.168.0.4:5000)出来,到不同的目标地址和端口,则NAT使用了不同的映射,转换成不 同的端口。 上面这个例子在实际环境中比较少见,我们再以QQ为例举一个真实且常见的例子(例5)。 假设 A(192.168.0.4)和 D(192.168.0.5)是同一NAT服务器(210.21.12.140)保护的两台私网机器,都运行了QQ客户端程序。 B机器在公网(210.15.27.166),运行QQ服务器程序。 C机器在公网(210.15.27.140),运行QQ客户端程序。 A上QQ先登陆到B,按照原则1,使用如下映射: A(192.168.0.4:4000)-& NAT(转换后210.21.12.140:4000)-& B(210.15.27.166:8000)(原则1,端口不变) 接着D上QQ也登陆到B,按照原则2,使用如下映射: D(192.168.0.5:4000)-& NAT(转换后210.21.12.140:4001)-& B(210.15.27.166:8000)(原则2,scoket不能有重复,此处4001仅表示转换后不同的端口,实际环境中决不是4001) 然后D欲和公网C(210.15.27.140)上的QQ通信,按照iptables转换原则,使用如下映射: D(192.168.0.5:4000)-& NAT(转换后210.21.12.140:4000)-& C(210.15.27.140:4000) 到此我们发现,和上例一样,从同一个内部地址和端口D(192.168.0.5:4000)出来,到不同的目标地址和端口,则NAT使用了不同的映射,转换成不同的端口。但和上例不一样的是,本例显然普遍存在于实际环境中。 上面所举两例表明,结论刚好和例3相反,即iptables应该属于Symmetric NAT。 为 什么会出现彼此矛盾的情况呢?首先从NAT分类的定义上来看, Stun协议和iptables对映射的理解不同。Stun协议认为,一个映射的要素是: 内部地址端口和NAT转换后地址端口的组合。而在iptables看来,一个映射的要素是:NAT转换后地址端口和外部目标地址端口的组合。另一方面则是 Stun协议里Discovery Process给出的测试环境不够全面之故,他只考虑了NAT后面仅有一台私网机器的特例(例3),没有考虑NAT后 面可以有多台私网机器的普遍例子(例5)。正是由于这两个原因,直接导致了上述矛盾的发生。所以,凡按照Stun协议标准设计的NAT分类检测工具对 iptables的检测结果必然是Port restricted NAT。(事实上,在例3那样的特例下,iptables确实是一个标准的 Port restricted NAT) 那么,iptables究竟属于哪种NAT呢?我们再来回顾一下Stun协议对Cone NAT的要 求:所有(或只要是)从同一个内部地址和端口出来的包,NAT都将它转换成同一个外部地址和端口。虽然iptables在部分情况下满足“从同一个内部地 址和端口出来的包,都将把他转换成同一个外部地址和端口”这一要求,但它不能在所有情况下满足这一要求。所以理论上,我们就只能把iptables归为 Symmetric NAT了。 下面,我们再来分析一下iptables的端口受限的属性,我们举一个反例证明之(例6),仍以前例说明如下: A机器连接过B机器,假使是 A(192.168.0.4:5000)-& NAT(转换后210.21.12.140:5000)-& B(210.15.27.166:2000) D机器连接过C机器,假使是 D(192.168.0.5:5000)-& NAT(转换后210.21.12.140:5000)-& C(210.15.27.140:2000) 现 假设iptables不具有端口受限的属性,则另一E机器在公网(210.15.27.153:2000)或C(210.15.27.140:2001) 向210.21.12.140:5000发包的话,应该能够发到内部机器上。但事实是,当这个包到达NAT(210.21.12.140:5000)时, NAT将不知道把这个包发给A(192.168.0.4:5000)还是D(192.168.0.5:5000)。显然,该包只能丢弃,至此,足以证明 iptables具有端口受限的属性。 所以,iptables是货真价实的Symmetric NAT。
附: 1、Stun全称Simple Traversal of UDP Through NATs,所以本文所涉及的包,皆为UDP包。 2、 本文虽然是针对linux下iptables的分析,但倘若把本文中关键词“iptables”换成“Win2000下的ics或nat”,则本文的分析 过程完全适用于Win2000下的ics或nat。即理论上Win2000下的ics或nat也是货真价实的Symmetric NAT,但实际上,凡按 照Stun协议标准设计的NAT分类检测工具对其检测结果也必然是Port restricted NAT。其实,不光是linux下iptables、 或者Win2000下的ics或nat、再或者任何其他NAT产品,只要他们遵循和iptables一样的两条转换原则,那么他们在Stun协议下的表现 是完全一样的。 3、虽然Win2000下的ics或nat在Stun协议下的表现和iptables完全一样,但其NAT时所遵循的原则1和 iptables还是略有差别:iptables对内部私网机器来的所有源端口都将适用Preserves port number,除非确因原则2发生 冲突而不得不更换源端口号,但在更换端口号时并不遵循内部端口+1原则(似乎没有规律)。Win2000下的ics或nat则仅对内部私网机器来的部分源 端口()适用Preserves port number,对于那些超过3000的源端口号或者因原则2发生冲突的端口号,系统从 1025开始重新按序分配端口,在此过程中,仍然遵循如前两个原则,只是原则1不再Preserves port number而已(在不与原则2发生冲 突的前提下,尽量重复使用小的端口号,故使用1025的几率远远大于…)。
即将推出其姊妹篇----iptables下udp穿越实用篇----“iptables与natcheck”
作者 omiga
| 人气(5) |
实现的是一个空调用实现一个函数调用,这话说得就很奇怪吧。^_^
printf("this is a call");}
int main(){ int buf[1];
buf[2] = (int)f;
return 0;}j这个函数没有一个地方是调用f的,注意这一点哦
这是因为buf[2]的溢出覆盖了main的返回地址
-- 》 低 [eip]
[ebp] [buf[0]] f函数f的地址 被放到了 ebp+8的地方,也就是刚好是[eip]的位置。
ebp+8是怎么产生出来的呢?嘿嘿。对于栈的访问c的策略就是ebp+位置,ebp-8放的是buf[0]的值 ebp 是buf[1]嘿嘿。知道了吧
可以 cl /FA 来产生汇编码细细的看这个。 mov
DWORD PTR _buff$[ebp+8], OFFSET FLAT:_f
作者 omiga
| 人气(1) |
链表与数组的区别A 从逻辑结构来看A-1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当
数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
A-2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、
删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
B 从内存存储来看B-1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小B-2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦.
堆和栈的区别
solost 于 2004年 10月09日 发表
一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—
由编译器(Compiler)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) —
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区
— 常量字符串就是放在这里的。 程序结束后由系统释放5、程序代码区— 存放函数体的二进制代码。
二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() {
栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }
二、堆和栈的理论知识 2.1申请方式 stack: 由系统自动分配。 例如,声明在函数中一个局部变量 系统自动在栈中为b开辟空间 heap: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 在C++中用new运算符 如p2 = (char *)malloc(10); 但是注意p1、p2本身是在栈中的。
2.2 申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制 栈:在Windows下, 栈是向低地址扩展的数 据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总 之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较: 栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
2.5堆和栈中的存储内容 栈: 在函数调用时,(1) 第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,(2) 然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,(3) 然后是函数中的局部变量。 注意: 静态变量是不入栈的。 当本次函数调用结束后,(1) 局部变量先出栈,(2) 然后是参数,(3) 最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较 char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb"; aaaaaaaaaaa是在运行时刻赋值的; 而bbbbbbbbbbb是在编译时就确定的; 但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 比如: #include void main() { char a = 1; char c[] = ""; char *p =""; a = c[1]; a = p[1];
} 对应的汇编代码 10: a = c[1]; A 4D F1 mov cl,byte ptr [ebp-0Fh]
4D FC mov byte ptr [ebp-4],cl 11: a = p[1]; B 55 EC mov edx,dword ptr [ebp-14h] A 42 01 mov al,byte ptr [edx+1]
45 FC mov byte ptr [ebp-4],al 第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
2.7小结: 堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
深度优先搜索与广度优先搜索有何区别呢?  通常深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。  广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些
作者 omiga
| 人气(2) |
inside win2k中,提到IRQL高于DPC级别的就无法使用页式内存,因为要是出现缺页不在物理内存的情况需要调用磁盘IO换页,这样的响应时间就无法保证了,这是很好理解的。可是问题是:无法使用页式内存就要求是使用物理内存,这样的话,要是这些物理内存是没有数据的还讲的通,页表在对这些页面访问时就都无法访问。可是要是物理内存是分配出去的,被某些页表使用,那数据需要换出,这样不也就违背了不使用页式内存的初衷?页式内存VS物理内存!GDTL.全局页表。LDT。局部页表。还有,DPC的设置,感觉是比较好的防止优先权倒置的好的办法,把中断处理的任务尽可能的拖到DPC去实现就保证IRQL不是老是处于高级别,这样有中断发生时,OS可以快速的响应。D可是,理解来说还是没有问题现在的问题是,要是驱动的中断响应结束了,这余下的任务拖到DPC去在有时间的时候实现,这样如何保证同步性,因为下次中断又接着马上就到了了,要是它依赖与上次事件的话,这样可怎么不?我想应该没有问题,可是详细的理解又有问题。OS高得头都大了。唉。
作者 omiga
| 人气(0) |
。4的不行了老的编译#include &linux/init.h&#include &linux/kernel.h&#include &linux/module.h&
static int dummy_init(void){
printk("hello,world./n");
return 0;}static void dummy_exit(void){}
module_init(dummy_init);module_exit(dummy_exit);
MODULE_LICENSE("GPL")------------------------------8 cut here 8-----------------------------------# gcc -c -O2 -DMODULE -D__KERNEL__ -I/usr/src/linux test.c# insmod test.oNo module found in objectinsmod: error inserting 'test.o': -1 Invalid module format准确的做法是:正确的做法是写一个Makefile,由内核的Kbuild来帮你编译-------------------------------8 Makefile 8-----------------------------------obj-m := module.oKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules--------------------------------8 cut here 8----------------------------------
作者 omiga
| 人气(2) |
现在觉得被人逼着换技术的郁闷了。居然不再使用VC6。我考You cannot - I received word from the SDK team that VC++ 6.0 is no longer a supported product.
The last version to support VC++ 6.0 is the February 2003 SDK.
No further Platform SDKs will be released that support VC++ 6.0.
This includes the upcoming release of the Windows 2003 Server SP1 SDK.
Please make your views known to Microsoft whether you agree with this decision.
One workaround is to copy only the lib files you are having problems with (e.g. uuid.lib, shell32.lib, msxml2.lib, and possibly others) from the Feb 2003 version.
This also means that if they add any new functions to those libs you will be missing out.分析原因呢?M$ SDK组说是BUG,编译器产生了叫连接器无法识别的符合。按照MSDN给出的解决方法,关优化,Enable Function-Level Linking 都不行我觉得是m$把库给更新了新的库中使用了新的符合定义,只有V7的连接才认。我FT.
作者 omiga
| 人气(0) |
vmvare是有linux/win下两个版本,有点吃内存,不过还是很爽的,装了redhat9.注意:要实现shared doc,首先要选好共享的文件夹就需要在启动redhat后,安装工具。然后su/sbin/telinit 3进入文字界面。mount /dev/cdrom /mnt/cdromcp vmvare_tools.tar.gz /tmptar zxf vmvare_tools.tar.gz./install.pl然后再 telinit 5进入图形界面/mnt/fsgh下的就是一个共享文件夹了就不需要什么网络了,不过注意的是,要是安装网络的话,主要要把网卡高级选项选为可为其它网络共享。
【上篇】【下篇】

我要回帖

更多关于 e4a调用接口 的文章

 

随机推荐