Symbian 网络编程API收藏
2010-09-06 08:09:00 来源:WEB开发网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发送数据。所以我们需要在接收到数据之后,尽可能快地进行数据的处理。
有一点,在我们进行已连接的socket的数据发送的时候,我们并不会打开活动对象。数据仅仅会在客户端程序或者用户希望发送数据到客户端的时候,才进行操作。
使用有连接的socket
回顾一下我们前面定义的CModel类,我们有一个成员变量,类型为CRx的iRxAO。
类CRx是一个继承自CActive的类,他也是一个活动对象。
CRx类的成员函数RxL(),定义如下;这个函数向连接到我们的服务器的客户端发出了一个一个异步请求。
void CRx::RxL ( ) //class CRx derived from CActive
{
// Issue read request
iSocket->RecvOneOrMore(iDataBuffer, 0, iStatus, iRecvLen);
SetActive();
}
函数RecvOneOrMore()将会在稍后,和其他一些读取以及写入socket的函数一同进行讨论。
在接入数据请求完成的时候,CRx::RunL()函数将会被调用,完成后返回的内容有完成状态事件以及新收到的数据内容。
那么再来回顾一下CModel类的另外一个成员变量,类型为CTx的iTxAO。
类CTx是一个继承自CActive的类,他也是一个活动对象。
CTx类的成员函数TxL(),如下所示;他想连接到服务器的客户端进行了一个发送数据的一部请求操作。
void CTx::TxL (TDesC& aData)
{
if (!IsActive())
{
更多精彩
赞助商链接