Symbian学习笔记(二)-套接字
基本步骤:1 连接Symbian OS的Socket服务器
无论客户端还是服务器,所有Series 60 套接字编程的第一步都是连接到Smbian OS套接字服务器。
//与Symbian OS套接字服务器连接
TInt err = iSocketServer.Connect();
if(err!= KErrNone && err != KErrAlreadyExists)
{
User::Leave(err);
}
注意: 所有希望使用套接字API的应用程序都必须连接到Symbian OS套接字服务器---这和连接到服务器套接字不是
同一概念。包含客户端套接字的应用程序必须连接到Symbian OS套接字服务器以创建套接字,之后,改客户端套接字将连接到一个服务器套接字--通常位于另一台设备中。
2 打开套接字
TInt err;
//打开套接字
err=iSocket.Open(iSocketServer, iProtocalInfo.iAddrFamily, iProtocolInfo.iSockType, iProtocolInfo.iProtocol);
if (err!= KErrNone && err != KErrAlreadyExists)
{
User::Leave(err);
}
同样,改步骤对于客户端和服务器套接字代码是相同的。注意,”打开“套接字的说法的说法略微有些迷惑性--实际上并未”连接“它。上面只是初始化一个套接字对象。连接将在下文中介绍,那时客户端和服务器使用的代码将开始出现区别。
3 连接服务器套接字
为把套接字初始化为服务器,需要执行3个步骤。
1)首先需要把该套接字绑定到一个地址和一个端口号,客户端套接字连接到此服务器时将需要指定它们。
2)把套接字绑定到地址和端口号之后,使用Listen()方法令它监听从别处达到的连接。
3)此外,需要使用第二个套接字为所有到达的请求服务,因为监听的套接字必须保持空闲,以监视其它到达的连接请求。
4)最后,需要调用Accept()接受第一个达到的请求。注意:有可能尚未接收到请求,但Accept()是一个异步调用,因此,它将在接受到请求时最终完成(另一种选择是,在这之前使用CancelAccept()也能取消)。另一方面,如果其它设备已经发出了一个请求,该请求将被挂起至Listen()建立的监听队列中,导致 Accept()快速返回。
任意情况下调用Accept() 的形式都是完全相同的,如下所示:
iSocket.Accept(iServiceSocket,iStatus);
iState = EAccepting;
SetActive();
在上面的代码中有值得注意的地方:
1)把第二个套接字(iservicesocket)作为套接字传递到Accept(),因为它才是连接建立之后实际用于数据传输的套接字。
2)CIrSocketEngine类是一个活动对象,为此,把自己的iStatus 成员传递到Accept(),随后调用自己的SetActive()方法。连接请求发生时,调用该对象的RunL()方法。
使用iState成员在CIrSocketsEngine类内实现了一个基本的状态机。这是必不可少的,因为套接字API本质上时异步的-调用RunL()时,必须能判断当前处于哪种状态(例如接受中、读取中或写入中等)。iState时CIrsocketEngine类中这样的状态机实现的一部分,而不是套接字API的一部分。服务器只是等待连接到达,而客户端会主动发起连接。
4 连接客户端套接字
5 传输数据
6 关闭套接字
页:
[1]