我必须再次回到Symbian的套接字。设置与远程服务器的连接的代码如下所示:
TInetAddr serverAddr;
TUint iPort=111;
TRequestStatus iStatus;
TSockXfrLength len;
TInt res = iSocketSrv.Connect();
res = iSocket.Open(iSocketSrv,KAfInet,KSockStream, KProtocolInetTcp);
res = iSocket.SetOpt(KSoTcpSendWinSize, KSolInetTcp, 0x10000);
serverAddr.SetPort(iPort);
serverAddr.SetAddress(INET_ADDR(11,11,179,154));
iSocket.Connect(serverAddr,iStatus);
User::WaitForRequest(iStatus);
在iSocket上我收到可变大小的数据包。在很少发生的情况下,这样的包被破坏了。我想要做的是清除当前在iSocket缓冲区中的所有数据并准备好读取。我还没有看到任何允许我清除缓冲区内容的RSocket方法。有谁知道这是怎么做到的吗?如果可能的话,我想避免使用RecvOneOrMore()或类似的recv函数清除缓冲区
由于
答案 0 :(得分:1)
你不应该按照你的要求去做。接收损坏的数据表明另一端的应用程序出现故障,因此这是应用程序层问题,而不是传输层问题。您应该在您基于TCP构建的应用程序协议中包含一个明确的错误响应消息,您可以在这种情况下使用该消息来通知另一端这种情况(如果您正在尝试某种形式的可靠性)。由于您在应用程序协议中显然具有特定的消息边界,因此不必关闭连接,只需通过读取字节直到下一个消息边界来丢弃损坏的消息,然后继续正常处理。
此外,即使你可以这样做,清除接收缓冲区也是错误的。 TCP是一种字节流协议,因此它没有消息边界的概念。在任何特定时间,接收缓冲区将包含许多字节,这些字节无法保证以任何方式与应用程序消息边界对应,因此清除它可能会消除许多正确的消息,并且可能只为下一个消息留下部分消息读。 (顺便说一句,这是由网络程序员开始时常见的错误,因为如果你的应用程序很少通信,它可能看起来好像TCP保留了消息边界。但它确实没有,并假设它将最终咬你。)