因为项目中用到了IP地址,所以对IP地址的存取是本项目必须面对的技术点。
Symbian中IP地址类型为TInetAddr,它继承自TBuf8<KMaxSockAddrSize>,是普通的socket server地址类TSockAddr的特殊类。
TInetAddr的赋值采取下面的方法:
TInetAddr iIPAddress;
const KFirewallRuleIPAddress = 10 ;
iIPAddress.SetAddress(
INET_ADDR( KFirewallRuleIPAddress,
KFirewallRuleIPAddress,
KFirewallRuleIPAddress,
KFirewallRuleIPAddress
)
)
const KFirewallRuleIPAddress = 10 ;
iIPAddress.SetAddress(
INET_ADDR( KFirewallRuleIPAddress,
KFirewallRuleIPAddress,
KFirewallRuleIPAddress,
KFirewallRuleIPAddress
)
)
开始我没有找到使用FileStream存取IP地址的方法,所以只好把IP地址声明成了TBuf类型,因为我知道TBuf的存取方法。但是后来 看到TInetAddr是TBuf8的子类,想想其存取方法应该和TBuf的一样,所以经过不断的摸索找到了正确的方法(其实不断的摸索,主要的原因是把 TUint8*写成了TUint16*,导致老是无法正确的读取IP地址)。
用RFileWriterStream来写IP地址:
1
RFs iFs ;
2 User::LeaveIfError(iFs.Connect()) ;
3 RFileWriteStream writer;
4 writer.PushL();
5 User::LeaveIfError(writer.Replace(iFs, KFirewallRuleFileName, EFileWrite));
6 TInet len = 0 ;
7 len = rule.iIPAddress.Length();
8 writer.WriteInt32L(len);
9 if (len) writer.WriteL(rule.iIPAddress.Ptr(), len ) ;
10 writer.CommitL();
11 CleanupStack::PopAndDestroy();
12 iFs.Close() ;
13
2 User::LeaveIfError(iFs.Connect()) ;
3 RFileWriteStream writer;
4 writer.PushL();
5 User::LeaveIfError(writer.Replace(iFs, KFirewallRuleFileName, EFileWrite));
6 TInet len = 0 ;
7 len = rule.iIPAddress.Length();
8 writer.WriteInt32L(len);
9 if (len) writer.WriteL(rule.iIPAddress.Ptr(), len ) ;
10 writer.CommitL();
11 CleanupStack::PopAndDestroy();
12 iFs.Close() ;
13
第7行获得IP地址的长度,其实本长度是固定的12个字节,不保存也可以。
第8行将其长度写入文件中。
第9行保存IP地址到文件中。
用RFileReaderStream来读IP地址:
1
RFs iFs ;
2 User::LeaveIfError(iFs.Connect()) ;
3 RFileWriteStream writer;
4 writer.PushL();
5 User::LeaveIfError(writer.Replace(iFs, KFirewallRuleFileName, EFileRead));
6 TInet len = 0 ;
7 len = reader.ReadInt32L();
8 if(len) reader.ReadL((TUint8*)rule.iIPAddress.Ptr(), len ) ;
9 rule.iIPAddress.SetLength(len) ;
10 CleanupStack::PopAndDestroy();
11 iFs.Close() ;
2 User::LeaveIfError(iFs.Connect()) ;
3 RFileWriteStream writer;
4 writer.PushL();
5 User::LeaveIfError(writer.Replace(iFs, KFirewallRuleFileName, EFileRead));
6 TInet len = 0 ;
7 len = reader.ReadInt32L();
8 if(len) reader.ReadL((TUint8*)rule.iIPAddress.Ptr(), len ) ;
9 rule.iIPAddress.SetLength(len) ;
10 CleanupStack::PopAndDestroy();
11 iFs.Close() ;