Symbian sockets 基本介绍
2010-05-31 20:15:00 来源:WEB开发网下面的代码是从一个完整的进行‘监听’(listening)的服务器类定义中取出的一部分。
class CModel : public CActive { public: void StartEngineL(void); private: void RunL(void); void DoCancel (void); private: RSocketServ iSession; RSocket iListen, iSocket; CRx* iRxAO; // 用于接收数据的活动对象 CTx* iTxAO; // 用于发送数据的活动对象 };请注意,在成员变量中有两个socket,一个是用来监听和连接的,而另外一个是用来处理和客户端之间进行数据的传输的。
在这个类的定义中,还有两个活动对象,他们是iRxAO和iTxAO。这两个活动对象用来在连接到服务之后异步地、分别地处理数据的发送和接收工作。
(对上面已经定义的类而言,这个类仅仅接收一个客户端连接,那么请你不要对自己的创造力作任何限制地去想象和学习一下吧,你可以以这个类定义为基础,将他扩展为接收多个客户端连接的服务器吧!)
下面我们来看看连接过程是如何实现的。
做好接收客户端连接的准备
首先,在我们的服务器没有进行服务接入请求之前,我们要先创建两个socket,创建方法如下所示:
// Need to use two sockets - one to listen for// an incoming connection.err = iListen.Open(iSession, KAfInet,KSockStream, KUndefinedProtocol);User::LeaveIfError(err);// The second (blank) socket is required to// build the connection & transfer data.err = iSocket.Open(iSession);User::LeaveIfError(err);一个socket叫做iListen,他扮演的就是 ‘监听者’的角色,用来监听是否有来自客户端的接入请求。iListen是一个和协议流关联的对象,在本例中这个协议就是TCP协议,因为我们使用的是 Internet地址格式。
另外一个socket,叫做iSocket,在现在是被构造为空socket的,它仅仅在客户端连接请求的时候才会被准备好进入工作状态。这个socket就是用来处理来自客户端的任何请求,并且进行数据传输工作的。
那么下面,监听socket就可以去进行监听客户端连接请求的工作了。
请注意上面例子中使用的两个不同的RSocket::Open()函数的多态。
其中第一个,用在iListen成员变量的,它是用来进行客户端请求连接监听的,所以它需要一个本地地址,只有这样连接数据才能本正确地路由到该对象。
要设定本地地址,我们需要将一个地址和一个socket进行绑定(bind)操作:
更多精彩
赞助商链接