好久不写了 懒啦~~

ITM6认证 三国杀 游泳 爬山 还有SC2
生活真精彩

Posted in Uncategorized | Leave a comment

解决socket端口被占用的问题

这段时间遇到一个棘手的问题。现象如下:

VC6工程,程序a.exe使用TCP的Socket通讯。但当程序a.exe结束后,通讯中绑定的端口会始终处于监听状态,外部地址是0.0.0.0,所属的进程PID是已经结束了的a.exe原有的PID。已经确认,a.exe在结束前已经成功调用closesocket()关闭了socket,并调用了WSAClean()。但端口依旧被占用,处于LISTENING状态。

经过长时间研究发现,问题是由于创建子进程导致的。a.exe中会通过CreateProcess()创建android的adb.exe。如果此时是第一次调用adb.exe,则adb.exe会自动创建adb-server作为常驻进程,不会自己退出。而CreateProcess()中又设置了bInheritHandles和lpProcessAttributes.bInheritHandle两个参数为TRUE,这是为了能够得到子进程的stdin/out流。

但一旦设置了这两个参数,则CreateProcess()就会使创建的子进程继承了所有父进程的句柄,包括已经创建的Socket。因此,只有当adb-server的这个adb.exe进程结束,才会释放掉占用的Socket端口。

问题找到了,解决方法如下:

创建Socket时,首先创建一个SOCKET sOld。然后调用DuplicateHandle()复制出一个新的SOCKET s。DuplicateHandle()的参数中,bInheritHandle设置为FALSE,这就复制出了一个不能被子进程继承的SOCKET;同时指定参数dwOptions为DUPLICATE_CLOSE_SOURCE,使得sOld在被复制后自动关闭。接下来使用新的s来通讯。这样,Socket就不会被继承了。问题也就解决了。注意,使用DuplicateHandle()复制SOCKET时,需要强制转换SOCKET为HANDLE类型。

Posted in Uncategorized | Tagged , , , , | Leave a comment

2012真的是世界末日?

今天三国杀群里收到一个链接:
http://www.tianya.cn/publicforum/content/funinfo/1/1854401.shtml

看了之后发现,这个是目前所有关于外星人的消息中最靠谱的一个。如果NASA的照片是真的,那说明人类将会面临一次巨大的事件。而且发生的日期近在眼前。看完了帖子,立刻搜索了相关内容。发现这个东西现在异常的火。

我要承认,有生以来第一次感受到了对未知的恐惧。其实是真是假不重要,因为即使是真的,以人类目前的科技水平,几乎束手无策。这一伙外星人与人类的关系,就像人类和蚂蚁的关系一样。因此自然而然的引出几种假设。其中最悲观的是,世界末日即将到来。那么,在世界末日来临前,我想要做些什么呢?

。。。。。。。。(个人隐私,省略若干文字)

恩,就这些。在思考这个严肃问题的时候,氛围是必不可少的。各位也好好想想吧!

Posted in Uncategorized | Tagged , , , | Leave a comment

有网蹭的感觉真爽

到家了。家里没有无线路由,只有一个有线的HUB。所以到家第一件事就是搜索有没有谁家的wifi信号。兄弟曾经告诉我,吉林是穷地方,方圆百里完全没有人用wifi。我这一搜,果然不多,就一个。仔细一看,我K,信号嗷嗷的好。看来不是对门就是楼下了。二话不说,AirCrack上场。经过一个小时的抓包,终于破解掉了。

之前在上海的时候,每次破出一个密码,总会喷饭一把。密码设置的实在比较搞。记得以前有一个是sylar,就是PB里面那个东东。这次的密码竟然是99:99:99:99:99,无语啊~

总之,本人一定文明蹭网,尽量不下载,基本只上网挂QQ,偶尔VS一把。哈哈,省了买路由的钱了~

Posted in Uncategorized | Tagged | Leave a comment

upgrade to MyHero2.0.4, Bluetooth OK!

公司年会上RP爆发,中了好象是三等奖:一个Motorola的蓝牙耳机H12。无奈伴随我数月的Magic爱机,烧的MyHero1.1.3蓝牙驱动有问题,无法正常使用。这次看来必须捣鼓捣鼓了,好歹对得起这小几百块钱。

首先下载好升级包myhero-1.1.x-to-2.0.4,这个要翻墙。否则只能在Windows下面用RayResource工具。但那个工具的下载链接貌似被河蟹了,干脆只能跑到Ubuntu下面tor。哎,按照国内目前上网的难度来估算,下一批世界最强黑客应该在中国产生。时势造英雄嘛!

按照这个链接上面的步骤,一步步下来,很快搞定了。第一次启动的时候在HTC splash里面等的时间超长(超过10分钟),但最终正常进入系统。已经安装的程序完全没问题。马上带上咱的H12打电话,OK啦~内牛满面~
这款蓝牙耳机的确非常不错,人性化的设计超出我的想象。原来耳机也可以做成这样!推荐购买。

Posted in Uncategorized | Tagged | Leave a comment

2010首博-从魔方看人生

好久不理这个Blog了,惭愧啊~~
怎么说也过了新年,还是转一篇老Blog上刚发的帖子吧。

祝大家新年好!

今年是收获的一年!

Posted in Uncategorized | Tagged | Leave a comment

Write a console plug-in for eclipse3.5

我第一个JAVA程序终于完成了,是一个eclipse的控制台插件。本插件的目的是,实现一个通用的控制台,当启动一个进程时,将进程的输入输出显示在Console View中。

Console的使用,通过接口来完成。主要的方法是open和close。当然可以继续增加其它一些方法,如改变尺寸等

public interface IMyConsole {
    void open();
    void close();
    ...
}

希望使用时能够尽量简便,例如希望在eclipse中开启一个cmd控制台:

    IMyConsole console;
    ...
    ProcessBuilder builder = new ProcessBuilder("cmd.exe");
    try {
        Process proc = builder.start();
        console = new ConsoleFactory("Windows cmd", null,
            proc.getOutputStream(),
            proc.getInputStream(),
            proc.getErrorStream());
        console.open();
    } catch (IOException e) {
        e.printStackTrace();
    }
    ...

实例化console时候,需要指明控制台的stdin,stdout和stderr。这样就可以灵活用于各种情况,如执行一个进程、socket流、文件流等。同时,也可以指定只使用stdout和stderr,作为纯粹的输出控制台。当然,如果将这些用法再封装一层就好了。实例创建出来后,调用open()方法即可打开控制台。
类的框架如下:

ConsolePlugin

(研究了几个小时UML,结果发现这东西不是一会就能玩明白的,干脆用土办法画图了) Continue reading

Posted in eclispe | Tagged , , , | Leave a comment

My First ChromeOS Exp.

电驴上拖下来,用VMWare6.5跑起来
启动速度一流,简直比resume一个RedHat还快
发布视频中的7秒,果然名不虚传
可这来的快去的也快
本想在ChromeOS里面发一个贴
结果在开网页的时候突然失去控制
只有鼠标能动,其余一概不动
看了一下时间,不到两分钟
看来Demo的时候能撑那么久,实在是个奇迹啊!

Posted in Uncategorized | Tagged , | 1 Comment

“adb forward”端口映射

曾经以为adb forward是个好东东,因为通过这个映射之后,在PC和设备之间就可以直接socket通信了。可现在终于发现,世界不是完美的。

Android Debug Bridge设计的目的,一是用来管理所有连接的设备;二是提供各种服务,供PC端有效的控制设备。主要包括三个部分:

1) ADB-server

运行在PC端,是一个始终在后台运行的进程,作为与手机端交互的唯一接口。ADB-server处理ADB-client的请求,一部分请求无须与设备交互,直接在PC本地完成;剩下的请求需要与设备端的adbd交互,ADB-server起到了一个switcher的作用。

2) ADB-client

运行在PC端,可以同时存在多个。每个ADB-client由用户启动,完成多种功能。其作用是与ADB-server交互,实现用户请求的功能。

3) adbd

运行在设备端的常驻进程,同时只存在一个。作用是接收PC端的ADB-server发来的请求,并作出对应操作。

这三个可执行程序都是同一套代码编译出来的,位于<Android Source Dir>/system/core/adb/

ADB-client和ADB-server对应同一个可执行文件“adb(.exe)”,编译时有-DADB_HOST=1宏。而adbd对应目标设备上的可执行文件”adbd”,编译时的参数是-DADB_HOST=0。

.              P  C                                                                                    Device
————————————–                                        ————————————-
[ADB-client]<—–>[Port A:]                                         [:Port A’]<——>[Program A]
[ADB-client]<—–>[Port B:]ADB-server<—–>adbd[:Port B’]<——>[Program B]
[ADB-client]<—–>[Port C:]                                         [:Port C’]———(empty)
.                               |<——–Android Debug Bridge———->|

(这个图实在是调不好了,不管了)

ADB提供了PC与设备交互的桥梁,结构上清晰明了。其中adb forward功能提供了端口映射,希望给用户提供透明的socket通信。但可惜,这与真实的网络socket有点区别。

在TCP网络编程中,Client的Socket(C)如果调用Connect()成功,就说明已经和Server端的Socket(S)连接上,可以通讯了。但是如果使用adb forward做端口映射,就不一样了。端口映射的实质是,让ADB-server作为一个switcher转发ADB-client的数据包,送给adbd,adbd再发给设备端的对应端口。因此一旦建立了映射,就相当于ADB-server开始监听这个目标端口。而此时如果有C去尝试Connect这个端口,是一定会成功的,因为与C连接的是ADB-server,而非真正的设备上的目标程序。这就出现了,即使Connect()成功,却完全无法知道究竟是否成功连接到S。

因此,判断真正连接成功的方法,只有轮询收发握手数据包。程序中约定好事先做个交互:C发送一个数据包,等待S回复;C如果收到了S的回复包,说明连通;如果接收超时,则认为没有连通。在没有连通的情况下,需要重新建立Socket,并Connect(),然后再尝试握手。

Posted in Android | Tagged , | Leave a comment

Hello world!

感谢曾经的zhourenjian老大给了我这一亩三分地,终于有了个域名了,可是这名字感觉好别扭啊!!

http://mandapeng.vip.zhourenjian.com/

那到底mandapeng是vip,还是zhourenjian是vip呢?这是个问题。

Posted in Uncategorized | 2 Comments