Symbian socket 网络编程方法
2010-03-18 20:59:00 来源:WEB开发网那么再来回顾一下 CModel类的另外一个成员变量,类型为CTx的iTxAO。
类CTx是一个继承自CActive的类,他也是一个活动对象。
CTx类的成员函数TxL(),如下所示;他想连接到服务器的客户端进行了一个发送数据的一部请求操作。
void CTx::TxL (TDesC& aData) { if (!IsActive()) { // Take a copy of the data to be sent. iDataBuffer = aData; // Issue write request iSocket->Send(iDataBuffer, 0, iStatus); SetActive(); } }
Send() 函数将会在稍后,和其他一些读取以及写入socket的函数一同进行讨论。
当数据发送请求完成的时候,CTx::RunL()函数将会被调用,同时返回的内容有发送操作完成的结果状态。
传输数据
现在我们来看看两台网络设备之间,究竟是如何利用socket来进行数据传输的。
如我们以前所知,在socket通信中,数据报通信和数据流通信是两种十分不同的通信方式。
无论我们使用的是数据报还是数据流的传输方式,每一个独立的数据单元在网络通信的两端被传输的时候都有可能经过十分不同的路由路径,因为在网络通信的双方之间总有着不计其数的子网络,而通信双方对数据单元的路由方向是无法控制的。这种情况是十分普遍而且正常的,由于数据流的传输方式也是以数据报形式为基础的,所以从这个角度来看的话,二者的路由特点是一致的。
接收数据
使用无连接的sockets
下面的函数,是RSocket提供的用来接收无连接的socket的接入数据的。
void RecvFrom(TDes8& aDesc, TSockAddr& anAddr, TUint flags, TRequestStatus& aStatus); void RecvFrom(TDes8& aDesc, TSockAddr& anAddr, TUint flags, TRequestStatus& aStatus, TSockXfrLength& aLen);
如果应用程序使用的是无连接的socket,那么需要使用RSocket::RecvFrom()这个这个方法来读取从另外一个远程主机发送过来的数据。
该函数的第一个参数是一个字符串,是用来保存接收数据的。
调用该函数的程序,会在一个完整的数据报接收完成的时候,得到相应的通知。接收数据的长度,就是接收字符串的长度。如果接收数据报的长度要比字符串的最大长度更长,那么接收数据的末尾将被截去。
该函书的第二个参数是要进行接收操作的远程主机的地址。这个地址需要是一个根据socket打开方式定义的协议格式相匹配的地址。例如,如果打开socket的时候定义的是TCP/IP协议,那么这个地址需要是一个TInetAddr类型的变量。
更多精彩
赞助商链接