Symbian socket 网络编程方法
2010-03-18 20:59:00 来源:WEB开发网我们会发现,这个函数有两个版本的重载,他们都进行了同样的操作,方式也一样。唯一不同的是,第二个函数可以将接收数据的长度,显式地返回给调用者。
还有一点,一个单独的socket在任何一个时间内,都只有一个状态为等待中的接收操作。
上面的方法,只能用于无连接(数据报)类型的socket连接。
使用连接的sockets
下面的函数是RSocket提供的用来从已经连接的socket中读取数据的函数原形。
void Recv(TDes8& aDesc, TUint flags, TRequestStatus& aStatus); void Recv(TDes8& aDesc, TUint flags, TRequestStatus& aStatus,TSockXfrLength& aLen); void RecvOneOrMore(TDes8& aDesc, TUint flags, TRequestStatus& aStatus, TSockXfrLength& aLen);
如果应用程序使用的是已连接的socket,那么应该使用上面的函数来进行远程主机的数据接收工作。
和前面的无连接socket类似,这些接收函数的第一个参数,仍然是接收数据要保存的目标字符串变量。
Recv() 函数会在目标字符串变量被填满或者连接断开的时候完成。在该函数完成调用的时候,读取数据的长度就是字符串的长度,除非在没有读取任何数据连接就断开了。
第二个Recv()函数的重载可以显式地获取接收数据的长度,该长度被保存在了类型为TSockXfrLength的函数参数中,这样的话判断接收数据长度就不必关联接收字符串的长度了。
最后一个函数RecvOneOrMore(),与Recv()不同,这个函数是会在函数接收到任何数据之后立刻返回的。言外之意,调用RecvOneOrMore()函数会接收到1--n个字节,其中n就是目标字符串的长度。同样地,如果连接被断开,RecvOneOrMore()函数仍然会立刻返回,并且不会返回任何数据。
虽然是已连接的socket,但是在发送过程中数据流并不一定都是物理上连续的,尽管从逻辑上看他们是流式的。所以,即便是使用已连接的socket,仍然应用程序--socket的调用者--来进行判断数据流的结束与否,边界切分等工作。
注意,由于我们使用的是已连接的socket,那么我们不需要指定接收收据的socket地址,因为已连接的socket是在连接动作发生的时候就已经指定好了传输目标主机地址信息了。
在这一部分的前半部分,我们介绍的各种函数都是具有比较高的复杂度的,可能对于应用程序开发者来说并不会具有特别的吸引力。
更多精彩
赞助商链接