c++ - Symbian:清除 RSocket 对象的缓冲区

标签 c++ symbian

我必须再次回到 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 函数清除缓冲区

谢谢

最佳答案

你不应该按照你的要求去做。收到损坏的数据表明另一端的应用程序出现某种故障,因此这是一个应用程序层问题,而不是传输层问题。在建立在 TCP 之上的应用程序协议(protocol)中,您应该包含一个明确的错误响应消息,您可以在这种情况下使用它来通知另一端这种情况(如果您正在尝试某种形式的可靠性)。由于您的应用程序协议(protocol)中显然有特定的消息边界,因此不必关闭连接,只需通过读取字节直到下一个消息边界来丢弃损坏的消息,然后从那时起继续正常处理。

此外,即使您可以清除接收缓冲区也是错误的做法。 TCP 是一种字节流协议(protocol),因此它没有消息边界的概念。在任何特定时间,接收缓冲区将包含许多不能保证以任何方式与应用程序消息边界对应的字节,因此清除它可能会摆脱许多正确的消息,并可能只为下一个消息留下部分消息读。 (顺便说一句,这是新手网络程序员常犯的错误,因为如果您的应用程序很少通信,它可能看起来好像 TCP 保留了消息边界。但实际上并没有,假设它确实存在, 最终咬你。)

关于c++ - Symbian:清除 RSocket 对象的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460962/

相关文章:

c++ - 使用 QtMobility/Location,Symbian Qt C++ 应用程序在模拟器中运行,但不在设备上运行

python - 应用程序要求互联网连接

c++ - 小的 C++ 代码刺激了我的头脑

c++ - 部分类特化只是编写完整特化的另一种方式吗?

c++ - 按常量偏移多段线

c++ - 如何在 Symbian 应用程序中重命名 "Options"菜单?

java - 通用 Java 移动开发

c++ - 将 CfbsBitmap 格式转换为 JPG

预期主表达式的 C++ 错误

c++ - C++ 中的多维数组值到字符串