Symbian OS sockets API
2010-07-22 01:42:00 来源:WEB开发网还要注意,因为我们的socket是使用Internet地址格式协议族进行打开操作的,所以我们调用Bind()函数时送入的函数参数TSockAddr就是一个TInetAddr类型的一个实例。
在TInetAddr类中,它除了保存TSockAddr中定义的一般性数据质紫外,还保存了一个TUint32类型的IP地址数据。在协议族属性中,TInetAddr类提供的永远是KAfInet值,因为该值表示这个地址是一个TCP/IP地址。
当完成了socket的建立,绑定了监听socket,我们就几乎完成了所有准备工作,可以相应来自任何客户端的连接请求。
下面我们就是需要把接入连接请求创建一个队列,这个时候我们需要调用RScocket::Listen()函数,另外还要注意我们应该使用长度为1的队列,之后我们看到连接是如何进行的时候,就会明白这个队列长度是足够了的。
void CModel::StartEngineL (void) { … // Listen for incoming connections... iListen.Listen(1); // and accept an incoming connection. // On connection, subsequent data transfer will // occur using the socket iSocket iListen.Accept(iSocket, iStatus); SetActive(); ... }
最后,我们调用异步函数RSocket::Accept()来准备接收客户端连接请求。
那么我们再来回顾一下继承自活动对象CActive类的CModel类,当一个客户端连接到我们定义的服务器类的时候,CModel::RunL()函数将会被调用。
该函数被调用后的过程,请看下一部分。
处理连接请求
当一个客户端连接请求被收到的时候,最前线的RSocket::Accept()函数执行请求完成,然后活动对象的RunL()函数将会被调用,这一切步骤都是因为CModel类是一个被激活状态的活动对象。
void CModel::RunL(void) { if (iStatus==KErrNone) { // Connection has been established NotifyEvent(EEventConnected); // Now need to start the receiver AO. iRxAO->RxL(iSocketType); } else // error condition ... }
那么假设现在所有步骤都是正常进行,那么我们获得的完成状态变量就是KErrNone。在上面的范例代码中,我们会向用户界面层传递一个连接建立成功的消息,然后我们启动活动对象,对接收到的数据进行处理,然后连接iSocket进行返回数据的准备。
因为我们进行操作的是一个异步系统,所以现在因为客户端和服务器是已经连接的状态,那么客户端可以在任何时间向服务器socket发送数据。所以我们需要在接收到数据之后,尽可能快地进行数据的处理。
更多精彩
赞助商链接