上一页 1 2 3 4 5 6 7 8 9 ··· 17 下一页
摘要: 我个人接触设计模式的时间较晚,将它们应用在实际项目中也就这一两年的时间.当时为了快速的学习掌握设计模式,除了参考GoF的<设计模式>之外,还在网上参看了TerryLee的.NET设计模式系列文章,以及程杰的<大话设计模式>,并利用业余时间写了不少C++的例子.此时将它们一一整理发出来,也可以说是对自身的一次总结吧.设计模式仅仅是模式而已,是一些解决特定问题的方法.世界上不存在通用的问题解决方案,因此才会有23种设计模式,而不是1种.当然,除了这些前人总结出来的模式之外,还有很多其他的模式,去解决以上这些模式所无法顺利解决的问题.设计模式在使用上充满了技巧.如果仅仅为了用 阅读全文
posted @ 2012-10-26 20:25 hailong 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 返回对象时,不能返回引用;其实在前几个item里就反复讲到operator的时候;Widget& operator=(int rhs){...return *this;}这里就返回了引用;但这个item里,作者又举出了反例;const Widgetoperator*(const Widget&,constWidget&){return Widget(....);}因为这样返回local 对象是很危险的,毕竟引用或指针所指的对象都消失了,还能操作它吗?很显然是很危险的。大师说的有道理,嗯,今天到这。 阅读全文
posted @ 2012-10-23 00:02 hailong 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 1.在函数形参传递参数时,一般可以传递指针或者引用;这样可以减少copy构造函数;如果不希望对象被改变,那就传递cosnt A&a吧;里面讨论了对于内置类型,有人建议用传值,但作者却坚持用引用,利用是:将来这个东西可能会膨胀;嗯,是的,有道理。另外传值的时候,有对象切割的危险,其实就是子类转化为父类的时候,子类的东西有可能被切掉,不会再有所谓的多态性;谁让你不传引用或指针呢?作者在之后详细论述了原因,当然我google了下,之前没怎么注意这个问题。2.对于STL的容器,比如std::string a ;我常看到的还是引用传参,该避免就避免呗。 阅读全文
posted @ 2012-10-22 23:43 hailong 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。我们定义四类(有相交的)线程不安全函数。第1类:不保护共享变量的函数将这类线程不安全函数变为线程安全的,相对比较容易:利用像P和V操作这样的同步操作来保护共享变量。这个方法的优点是在调用程序中不需要做任何修改,缺点是同步操作将减慢程序的执行时间。第2类:保持跨越多个调用的状态函数一个伪随机数生成器是这类不安全函数的简单例子。unsigned int next = 1; int rand(voi 阅读全文
posted @ 2012-10-22 20:44 hailong 阅读(7865) 评论(0) 推荐(0) 编辑
摘要: 看来如果类比较复杂,自己写copying fun还是比较麻烦的事情:#include <iostream>#include<string>using namespace std;class Widget{public: Widget(int aData):m_Data(aData) { } virtual void Swap(Widget &aRhs) { int lTemp = aRhs.m_Data; aRhs.SetData(m_Data); m_Data = lTemp; } Widget& operator=(const Widget & 阅读全文
posted @ 2012-10-19 23:00 hailong 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 这个item主要分析了防止对象自我赋值,利用copy-and-swap策略来解决。写了小代码,其实在实际中大部分会简单写:#include <iostream>#include<string>using namespace std;class Widget{public: Widget(int aData):m_Data(aData) { } virtual void Swap(Widget &aRhs) { int lTemp = aRhs.m_Data; aRhs.SetData(m_Data); m_Data = lTemp; } Widget& 阅读全文
posted @ 2012-10-19 22:09 hailong 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 混杂模式(Promiscuous Mode)是计算机网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到,同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在Linux操作系统中设置网卡混杂模式时需要管理员权限。在Windows操作系统和Linux操作系统中都有使用混杂模式的抓包工具,比如著名的开源软件Wireshark。co 阅读全文
posted @ 2012-10-15 09:17 hailong 阅读(492) 评论(0) 推荐(0) 编辑
摘要: http://www.rhyous.com/2011/11/13/how-to-read-a-pcap-file-from-wireshark-with-c/In my Computer Security class I am taking as part of my Masters of Computer Science course, we need to parse a Pcap dump file.PrerequisitesIt is expected you have Visual Studio 2010 already. It may work the same with Visu 阅读全文
posted @ 2012-10-14 23:45 hailong 阅读(5664) 评论(0) 推荐(0) 编辑
摘要: 来自http://www.cnblogs.com/ErinCodeMM/archive/2011/07/10/2102517.html// OpenAndFilterAndPres.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "pcap.h" #include "remote-ext.h" #include"stdlib.h" /* 4 bytes IP address */ t 阅读全文
posted @ 2012-10-14 23:41 hailong 阅读(1413) 评论(0) 推荐(0) 编辑
摘要: 除了在release下编译运行外,在生成的release文件夹下添加Qt\Desktop\Qt\4.8.1\msvc2008\bin因为我们本来就是用的Qt的这部分,反正经测试ok了。哦,忘记了,需要添加:QtCore4.dll,QtGui4.dll这两个dll文件就行了,因为我的项目里只用到了这两个,如果项目中设计调用其他dll,那根据提示添加就行了!其实最后需要的也就是**.exe,**.dll和上述两个dll就ok了。 阅读全文
posted @ 2012-10-09 23:09 hailong 阅读(424) 评论(0) 推荐(0) 编辑
摘要: 很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。学过TCP/IP的同学应该都知道,传输层的两个主要协议是UDP和TCP,其中UDP是无连接的、面向packet的,而TCP协议是有连接、面向流的协议。所以非常容易理解,使用UDP协议的客户端(例如早期的“OICQ”,听说OICQ.com这两天被抢注了来着,好古老的回忆)需要定时向服务器发送心跳包,告诉服务器自己在线。然而,MSN和现在的QQ往往使用的是TCP连接了,尽管TCP/IP底层提供了可选的 阅读全文
posted @ 2012-10-07 23:15 hailong 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 封装变化多用组合,少用继承针对接口编程,不针对实现编程为交互对象之间的松耦合设计而努力类应该对扩展开放,对修改关闭依赖抽象,不要依赖具体类这和朋友交谈(减少依赖)Don't call me, I will call you(依赖倒置)类应该只有一个改变的理由(只负责一组功能)摘自《head first 设计模式》摘自:http://my.oschina.net/soitravel/blog/52366 阅读全文
posted @ 2012-10-07 23:01 hailong 阅读(161) 评论(0) 推荐(0) 编辑
摘要: It cover for 4 main issues:Data slicing- UDP datagrams cannot contain an infinite amount of information. Therefore, you will (often) need to slice your information into multiple datagrams and reconnect the puzzle pieces at the other end. For a given 'slicing', you need unique identifier and 阅读全文
posted @ 2012-10-06 22:52 hailong 阅读(165) 评论(0) 推荐(0) 编辑
摘要: #include "exp.h"#include<QString>exp::exp(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags){ ui.setupUi(this); connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));} 当然还需要在.h里声明信号。 阅读全文
posted @ 2012-10-06 18:09 hailong 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 原来一句话就可以搞定了:int main(int argc, char *argv[]){ QApplication a(argc, argv); ** w; w.setWindowFlags(w.windowFlags()& ~Qt::WindowMaximizeButtonHint& ~Qt::WindowMinimizeButtonHint); w.show(); return a.exec();} 阅读全文
posted @ 2012-10-06 17:26 hailong 阅读(4145) 评论(0) 推荐(0) 编辑
摘要: 看网上有人专门做了一些小工具,用来统计代码行数。感觉不是很必要。因为Visual Studio中的搜索功能支持正则表达式(虽然语法比较诡异),我们完全可以通过正则表达式来遍历整个解决方案从而获得代码行数。^:b*[^:b#/]+.*$需要注意:#开头和/开头或者空行都不计入代码量。如果需要只统计代码文件的代码量,可以按住Ctrl+Shift+F之后选择查找文件的类型。引用:http://www.imkevinyang.com/2009/05/visual-studio%E7%BB%9F%E8%AE%A1%E6%9C%89%E6%95%88%E4%BB%A3%E7%A0%81%E8%A1%8C% 阅读全文
posted @ 2012-10-06 15:11 hailong 阅读(173) 评论(0) 推荐(0) 编辑
摘要: int GetInputStyle(){ if ("0x" == m_Str.substr(0,2)) return HexInput; boost::regex lRe("[2-9]"); boost::match_results<std::string::const_iterator> what; bool lSearchResult = boost::regex_search(m_Str.begin(), m_Str.end(), lRe); if(false == lSearchResult) { lRe = "[0-1]& 阅读全文
posted @ 2012-10-06 11:05 hailong 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 替换!先替换空格,按ctrl+H,把所有空格替换掉,然后替换空行,替换^p^p为^p,如果有手动换行符则需要先替换为自动换行符,^l替换为^p 阅读全文
posted @ 2012-10-06 10:18 hailong 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续。如果想改变这种一直等下去的焦急状态,可以多线程来实现(不再等待,同时去recv,同时阻塞,呵呵),每个socket连接使用一个线程,这样效率十分低下,根本不可能应对负荷较大的情况(是啊,占用各种资源,电脑啊,你耗不起)。这时候我们便可以采取select模型。select允许进程指示内核等待多个事件中的任何一个发生,并仅在有一个或多个时间发生或经历一段指定时间后才唤醒它。select告诉内核对哪些描述子感兴趣以及等待多长时间。这就是所谓的非阻塞模型,就是进 阅读全文
posted @ 2012-10-05 00:20 hailong 阅读(8008) 评论(0) 推荐(1) 编辑
摘要: 根据 博客园博主+石头+的原始代码,我修改为利用std::queue管理的消息队列:#include <iostream>#include <Windows.h>#include<queue>using namespace std;const int MAXMESSAGE = 1024;class CXMessageList{public: CXMessageList(); ~CXMessageList(){};public: MSG* GetTopMessage(); MSG* WaitForMessage(); int GetMessageCount() 阅读全文
posted @ 2012-10-05 00:05 hailong 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 摘自:http://www.cnblogs.com/jiayongzhi/archive/2011/05/09/2041655.html#include <iostream>#include <Windows.h>using namespace std;const int MAXMESSAGE = 1024;class CXMessageList{public: CXMessageList(void); ~CXMessageList(void){};public: MSG* GetTopMessage(); MSG* WaitForMessage(); int GetM 阅读全文
posted @ 2012-10-04 23:35 hailong 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 造了线程用select IO模型:#include <winsock.h>#include <stdio.h>#define PORT 5010#define MSGSIZE 1024#pragma comment(lib, "ws2_32.lib")int g_iTotalConn = 0;SOCKET g_CliSocketArr[FD_SETSIZE];DWORD WINAPI WorkerThread(LPVOID lpParameter);int main(){ WSADATA wsaData; SOCKET sListen, sClien 阅读全文
posted @ 2012-10-04 13:13 hailong 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 上班两个月了,因为不是计算机专业出身,曾经因为不知道windows不能计算微妙级以下而被同时开玩笑非计算机专业是可以理解的,谁让我没读过《计算机操作系统》呢;老大要求我读《effective C++》和UML,因此假期没回家,好好读书吧;侯大师翻译的书各个是精品,《effective C++》没天狂啃几篇,除了模板编程,其他章节走马观花地看完了,舒了口气,但自己掌握了多少呢,表示还木有深入测试;因为看到项目中反复涉及网络编程,而且在设计中各位老师利用了网络中的一些策略,令我很不解,果断买了本《unix网络编程》,发现TCP/IP简直太好玩了,现在读到第6章了;虽然我在win32下写代码,但原书 阅读全文
posted @ 2012-10-04 08:41 hailong 阅读(346) 评论(0) 推荐(0) 编辑
摘要: server:#include"WinSock2.h"#include "time.h"#include "stdio.h"#include <string>#include <iostream>#pragma comment(lib,"WS2_32")using namespace std;const int MaxLine = 1024;char lBuf[MaxLine];short gPort = 9877;struct Args{ long arg1; long arg2;};st 阅读全文
posted @ 2012-10-04 00:21 hailong 阅读(189) 评论(0) 推荐(0) 编辑
摘要: server:#include"WinSock2.h"#include "time.h"#include "stdio.h"#include <string>#include <iostream>#pragma comment(lib,"WS2_32")using namespace std;const int MaxLine = 1024;char lBuf[MaxLine];short gPort = 9877;int main(){ int lRet = 0; WSADATA lWsa 阅读全文
posted @ 2012-10-03 23:56 hailong 阅读(195) 评论(0) 推荐(0) 编辑
摘要: server:#include"WinSock2.h"#include "time.h"#include "stdio.h"#include <string>#include <iostream>#pragma comment(lib,"WS2_32")using namespace std;const int MaxLine = 1024;char lBuf[MaxLine];short gPort = 9877;int main(){ int lRet = 0; WSADATA lWsa 阅读全文
posted @ 2012-10-03 22:44 hailong 阅读(189) 评论(0) 推荐(0) 编辑
摘要: netstat -a 查看服务器监听套接口的状态;信号就是通知某个进程发生了某事件,也称为软件中断。常常是异步发生。 阅读全文
posted @ 2012-10-03 22:24 hailong 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 打开process explorer选中想要查看句柄或者加载的dll的进程菜单点击view——Lower Pane View,其下有DLLS和Handles,选中即可。同时,需要勾选Show Lower Pane才能显示出来 阅读全文
posted @ 2012-10-03 17:17 hailong 阅读(1216) 评论(0) 推荐(0) 编辑
摘要: 看到网上有一个示例,我查了先关函数,做了一些注释,自己学习下:#include <iostream>#include <string>#include <WinSock2.h>using namespace std;#pragma comment(lib, "WS2_32")int main() { WSAData wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); START 阅读全文
posted @ 2012-10-03 17:07 hailong 阅读(3039) 评论(0) 推荐(0) 编辑
摘要: sever显示client的IP地址和端口:#include"WinSock2.h"#include "time.h"#include "stdio.h"#include <iostream>#pragma comment(lib,"WS2_32")using namespace std;const int MaxLine = 1024;int main(){ int lRet = 0; WSADATA lWsaData; if ((lRet = WSAStartup(MAKEWORD(2,2), &a 阅读全文
posted @ 2012-10-03 12:43 hailong 阅读(422) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 17 下一页