WEB开发网
开发学院手机开发Symbian 开发 Symbian OS sockets API 阅读

Symbian OS sockets API

 2010-07-22 01:42:00 来源:WEB开发网   
核心提示:还要注意,因为我们的socket是使用Internet地址格式协议族进行打开操作的,Symbian OS sockets API(11),所以我们调用Bind()函数时送入的函数参数TSockAddr就是一个TInetAddr类型的一个实例,在TInetAddr类中,那么客户端可以在任何时间向服务器socket发送数据

还要注意,因为我们的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发送数据。所以我们需要在接收到数据之后,尽可能快地进行数据的处理。

上一页  6 7 8 9 10 11 12 13 14 15 16  下一页

Tags:Symbian OS sockets

编辑录入:coldstar [复制链接] [打 印]
赞助商链接