用CSocket构建C/S结构
转帖http://www.cppblog.com/bidepan2023/archive/2008/01/22/41632.html
CSocket派生于CAsyncSocket, 所有施诸于上的操作皆为同步操作。比如Connnect,Receive等。
同步操作的优点是简单易用,但缺点也显而易见,效率低下,因为你必须等到一个操作完成之后才能进行下一个操作。
如果你很关心效率,就应该优先使用CAsyncSocket。反之就用CSocket。
下面将说明如何用CSocket创建简单的服务器和客户端。
[创建服务器]
服务器的运作有5个阶段:
1. 创建服务器Socket并开启监听。
2. 获取新的客户端连接Socket,将之加入客户端Socket列表以管理之。
3. 客户端Socket读取数据并发送数据。
4. 客户端连接被动关闭,从列表删除。
5. 程序关闭,进而服务器连接主动关闭。
为了维持5阶段的运作,需要两种Socket协同工作, 第一种用作服务器监听(负责步骤1,2,5),第二种用作客户端管理(负责步骤3,4)。
两种Socket皆派生自CSocket, 通过重写不同的CSocket成员函数以实现不同的功能。
前者需要在服务器初始化阶段创建出来CSocket::Create()并开启监听CSocket::Listen()(步骤1)。并在服务器退出时主动关闭连接CSocket::Close()(步骤5)。
前者还需要重写OnAccept以在新的客户端连接到来时被通知,同时产生客户端管理Socket(步骤2)。
后者需要重写OnReceive以在有数据到来时被通知,或重写OnClose以在连接被动关闭(客户端关闭)时被通知(步骤3,4)。
读写数据需要CSocketFile以及CArchieve的支持。前者将CSocket当作一个文件,后者则完成在此文件上的读写操作。
通常你需要添加一个CSocketFile成员,两个CArchieve成员(一个用于读,一个用于写),然后在Socket创建完成后初始化这些成员
socketFile_ = new CSocketFile( this ); // 在archive创建出来后基本上就不需要操作他了,直到Socket关闭
archiveIn_ = new CArchive( socketFile_, CArchive::load ); // 用于读
archiveOut_ = new CArchive( socketFile_, CArchive::store ); // 用于取
并在OnRecevie中用archiveIn_读取数据,用archiveOut_写入数据。像这样:
int value;
archiveIn_ >> value;
archiveOut_ << value * value;
下面是比较完整的Server端的源代码:
//---------------------------------------------------------------------------------
// CServerDoc.cpp
//-----------------------------------------------------------------------
相关文档:
通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,就在Matlab里键入mex -setup,下面只要根据提示 ......
Precedence Operator Description Example Overloadable Associativity
1
::
Scope resolution operator
Class::age = 2;
no
none
2
()
()
[]
->
.
++
--
const_cast
dynamic_cast
static_cast
reinterpret_cast
typeid
Function call
Member initalization
Array access
Member access from ......
一、一个经过编译的C/C++的程序占用的内存分成以下几个部分:
1、栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。
2、堆区(heap) :一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 ......
C字符串长度定义规范
(转载请注明来源于金庆的专栏)
因为总是见到C字符串长度相关的错误, 所有定个规范出来, 有利于减少错误.
关键在于C字符串有个结尾0, 处理时需要注意.
定义字符串长度有两种方式, 一种是用字符串的大小, 一种是字符串的长度.
字符串的大小即内存空间的大小, 而串长度加1才是所需空间.   ......
定义:设a对b的乘法逆元是x则可以记为a*x=1 mod b,即a和x的积除以b的余数是1;
乘法逆元常用算法是欧几里德算法:
//算法求d关于模f的乘法逆元d-1 ,即 d* d-1 mod f = 1
1 。(X1,X2,X3) := (1,0,f); (Y1,Y2,Y3) := (0,1,d)
2。 if (Y3=0) then return d-1 = null //无逆元
......