心随所致,梦想为开。Follow the Dreams & Heart.
技术讨论
技术随想,更专业的技术问题在http://www.ucosoft.com
突破公司网络封锁,畅游无限网络
Dec 2nd
2010.06.10补充:随着vps的价格降低,现在采用vps方案进行解决已经更加经济和合理。这样可以保持一台24小时在线的服务器,有着固定ip和更多的功能。
具体可参考下文,只需要在其中定制对应的代理端口即可。
在VPS上用3Proxy架设http代理和socks代理(Ubuntu)——————-补充结束,以下为以前旧文———————————–
似乎现在总是喜欢来点噱头,不管怎么样下面总结一下怎么突破公司的BT网络限制实现自由上网的方法,希望不会被领导看到,也不要被同事们发扬广大。
公司是由科研院所改制的股份制企业,很多地方都体现着一种呆板和守旧,网络也不例外。
在公司局域网上网需要通过统一的ISA服务器(10.0.0.1)并以域帐号验证身份。对于大多数普通员工而言,只开放了smtp和pop的端口(这还是在2006年新年以后的恩赐,当时年终总结的时候,我在总结报告里提出作为程序研发人员,连email的权限都没有实在严重影响工作等等,反正后来就开放了,不知道是不是因为我提的原因),我当然也不例外。即使对于某些可以上网的同事,也是需要设置10.0.0.1:8080的代理才可以。
Microsoft的ISA防火墙还是非常强大和完善的,它通过在客户端安装ISA Firewall client,劫持socks通讯到ISA服务器,通过基于域帐号的身份验证和预设的规则决定是否允许通讯。详细资料参考Microsoft ISA Server: Integrated Edge Security Gateway Product。这样的体系几乎没有办法强制的绕过,所以只有变通处理。
由于开通了SMTP和POP的权限,也就是说,如果没有进行内容过滤的话,25和110端口应该是开放的,所以如果在外部在上述端口上开设代理服务器,那不就骗过去了?
由于这些端口具有明确用途,网上的公共代理没有开设在上述端口的代理服务器的,所以只好自己动手,拿自己家的电脑顶上。
代理软件有很多,最简单的就是CCProxy了,从网上下载回来,最新的版本是6.3.9,演示版支持3个用户,自己用就够了。启动CCProxy,在服务设置里面打开的http和socks两种代理,并分别把服务端口设置在25和110。同时在用户设置了帐户密码,禁止匿名使用。
在公司电脑上,启动ISA firewall client,打开ie,设置好代理为 221.111.33.123端口25,地址栏输入http://www.ucosoft.com,成功了。然后测试socks代理,flashget下载,cterm上bbs都没有问题,但是在使用msn上碰到了问题,发现不论是使用http代理或者是socks代理,都不能登录,或者登录之后不能显示联系人名单,不知道是否ISA服务器上做了特殊的限制,只好拿Google Talk(gtalk)代替,效果不错。
后来发现使用http代理,在访问某些https网站时可能白屏,不知道时ccproxy的bug还是其它原因,利用FreeCap封装利用socks代理则没有问题。
最后,由于服务器时adsl拨号,每次的ip都会变,为了不要每次都抄录ip,采用了花生壳的DDNS客户端软件,当前版本是3.9。
总结:
利用25和110端口在公司外部利用CCProxy开设代理服务器,在公司通过http、socks代理访问网络,对于不支持代理的软件,可以利用FreeCap来进行封装利用socks代理。同时利用花生壳的DDNS软件动态更新域名的ip,省却记忆ip的烦恼。
后记:
曾经想过一个问题,为什么现在才想到这些呢?原因似乎只有一个,现在需要。
Looked.P中毒风波及思考
Nov 30th
办公室内同事电脑接连中毒W32.Looked.P,并且通过内部共享网络迅速传播。 分析其原因,最主要的就是不及时更新病毒库,Norton在2006.11.1号的病毒库就已经 更新并且可以杀灭,但是在11.20之后还会中毒,只能在于为及时更新之原因。而未及时更新病毒库的首要原因可以归结为网络环境的问题,对于一个软件开发企业, 不许员工上网可谓可悲,而想出通过Remote Desktop登陆一台远程2003服务器一超低权 限上网可谓可笑。而同时网络也并非只有http,以封锁网络来减少员工的工作外时间可 谓荒唐之极。
兹以本文纪念,并附W32.Looked.P的技术资料及杀毒方法。zz自Symantec Antivirus网 站。
Displaying a Bitmap from a BMP File
Sep 13th
发件人: wangxl [mailto:hamo2k@163.com] 发送时间: 2006年9月13日 23:09 收件人: ‘wangxianlei@cabrtech.com’ 主题: Displaying a Bitmap from a BMP File
Displaying a Bitmap from a BMP File Rating:
Ramakrishna Talla (view profile) April 3, 2003Environment: MFC, Visual C++ 6.0, Windows 2000 (continued)
The following code fragment shows how to read an image from a BMP file and display it in your MFC application window. You could see several articles on the same focus; the one I present here is very simple, with just a few lines of code. The code given below has been tested with Visual C++ 6.0 on Win 2000.
Create a single document interface application; select CFormView as the base class for the application’s view base class. Click on the resource tab on the project explorer to navigate to the resource editor and drag a button to the dialog resource. Double-click the button to add a handler to the application’s view class, as shown below.
void AppView::OnButton1()
{
}
Step 1: Load the Image File
Call the following:
CString szFilename ("C:\Talla\yourimg.bmp");
HBITMAP hBmp = (HBITMAP)::LoadImage(
NULL,
szFilename,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION
);
Step 2: Create a Bitmap Object and Attach It to the Object
CBitmap bmp; bmp.Attach(hBmp);Step 3: Create a Memory DC and Select the BMP to It
You also need to More >
auto_ptr的应用
Sep 13th
template<class T> class auto_ptr { public: typedef T element_type; explicit auto_ptr(T *p = 0) throw(); auto_ptr(const auto_ptr<T>& rhs) throw(); auto_ptr<T>& operator=(auto_ptr<T>& rhs) throw(); ~auto_ptr(); T& operator*() const throw(); T *operator->() const throw(); T *get() const throw(); T *release() const throw(); }; The class describes an object that stores a pointer to an allocated object of type T. The stored pointer must either be null or designate an object allocated by a new expression. The object also stores an ownership indicator. An object constructed with a non-null pointer owns the pointer. It transfers ownership if its stored value is assigned to another object. The destructor for auto_ptr<T> deletes the allocated object if it owns it. Hence, an object of class auto_ptr<T> ensures that an allocated object is automatically deleted when control leaves a block, even via a thrown exception.
—– 可以自动释放对象。 如 auto_ptr<C> p(new C()); p->DoSomething();
PHP+ACCESS的解决方案
Sep 6th
由于一些低价的空间支持ACCESS数据库,因此开发起来比用php+mysql这套黄金搭档要别扭许多,但是也不是没有解决方案。
可以采用下面的例子,利用adodb.connection来进行access数据库的连接。
其中对于数据连接驱动有两种,可以根据虚拟主机的实际情况进行选择。
<?php $dbc=new com(“adodb.connection”); //$dbc->open(“driver=microsoft access driver (*.mdb);dbq=D:\virtualhost\web10022\www\test\aaa.mdb”); $dbc->open(“Provider = Microsoft.Jet.OLEDB.4.0;Data Source = D:\\virtualhost\\web10022\\www\\test\\aaa.mdb”); $rs=$dbc->execute(“select * from adminuser”);
$num_columns = $rs->Fields->Count(); echo $num_columns . “\n”;
$i=0; while (!$rs->eof){ $i+=1; $fld0=$rs->fields["username"]; $fld1=$rs->fields["password"]; echo “$fld0->value $fld1->value<br>”; $rs->movenext(); } $rs->close(); ?>
由定义消息引起的Debug版正常而Release版异常的问题及解决方案
Sep 1st
在使用了自定义消息的程序中,有可能出现Debug版正常而Release版非法操作的问题。
下面是一种原因以及其解决办法:
问题的描述: ================
定了了自定义消息: #define WM_DEMOWORK WM_USER+1 消息相应函数: afx_msg void OnDemoWork(); 消息映射: ON_MESSAGE(WM_DEMOWORK,OnDemoWork)
上述代码编译没有任何错误,并且在Debug版中运行正常,但是在Release版中会报非法 操作。
原因: ================ 在MFC中,ON_MESSAGE宏的定义如下: #define ON_MESSAGE(message, memberFxn) { message, 0, 0, 0, AfxSig_lwl, (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn },
可见,在ON_MESSAGE宏中认为消息相应函数memberFxn的原型为 LRESULT (*pProc)(WPARAM, LPARAM)的形式,它有两个参数, 分别为WPARAM, LPARAM。
解决方案 =============== 了解具体的原因后,解决就非常容易。有两个方案:
方案1: 修改消息相应函数的定义,增加函数参数。如: afx_msg void OnDemoWork(WPARAM wParam, LPARAM lParam);
方案2: 如果消息相应函数中不需要消息参数,可以利用另外一个消息映射宏ON_MESSAGE_VOID 即可。如 ON_MESSAGE_VOID(WM_DEMOWORK,OnDemoWork)
其中ON_MESSAGE_VOID的宏定义为: #define ON_MESSAGE_VOID(message, memberFxn) { message, 0, 0, 0, AfxSig_vv, (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&memberFxn },
其中消息相应函数原型为void (*pProc)(void)。 ;
用VC纯资源dll解决国际化问题
Aug 22nd
由于MFC应用程序也有自己的资源文件,当你调用MFC函数比如 CString::LoadString 或其它 LoadIcon 时,MFC应用程序框架首先跟踪搜索EXE文件的资源,然后才是DLL和 MFC的资源,因此在使用纯资源DLL时候,必须人为先改变资源的搜索顺序,可以通过使 用 AfxSetResourceHandle 函数来实现,具体实现如下:
BOOL CMultilanguageApp::InitInstance() { AfxEnableControlContainer();
if (m_bChinese) { m_hLangDLL=::LoadLibrary(“chinese.dll”); } else { m_hLangDLL=::LoadLibrary(“english.dll”); }
AfxSetResourceHandle(m_hLangDLL);
…… }