【问题标题】:More bytes sent than what I should receive via socket发送的字节多于我应该通过套接字接收的字节
【发布时间】:2011-04-28 16:55:46
【问题描述】:

在我的应用程序中,我发现我收到的数据比我预期的多 2 个字节。我不知道这 2 个字节是什么意思,因为在客户端我正在记录发送的字节并且我在服务器上接收到所有字节,但是在数据之后我仍然收到这 2 个字节,这会使我的程序崩溃。为什么?有什么想法吗?

编辑 1

在客户端

int sentBytes = send(socket, data, size, 0);

在服务器上

int receivedBytes = SOCKET_ERROR;
char *header = new char[8];
receivedBytes = recv(socket, header, 8, 0);

if (receivedBytes == 0 || receivedBytes == WSAECONNRESET)
{
    ...
}
else
{
    size_t data_size = 0;
    std::istringstream is(std::string(header, 8));

    if (!(is >> std::hex >> data_size))
    {
        char *data = new char[data_size + 1];
        data_size = recv(socket, data, data_size, 0);
    }
}

我正在使用带有 WSAAsyncSelect 的 win32 消息循环

编辑 2

我正在使用前 8 个字节发送一个十六进制值,其中包含我应该在服务器上接收到的消息长度

【问题讨论】:

  • 是否考虑了开始和结束传输(STX 和 ETX)字符?
  • @Heandel 添加了代码@Cole 抱歉,我不明白,你在说什么?
  • 那么额外的两个字节 com 在哪里呢?收到的data_size 比预期的大两个?第二次调用recv() 读取的数据比data_size 中指定的多?这两个额外的字节出现在哪里?
  • 在您收到的数据中,您不期望的 2 个字符是什么?它们与您期望的数据相比处于什么位置?
  • @Cole @sth 我正确接收了我的所有数据,我可以使用它们并且它们没问题,在接收到我的数据的最新接收后两个字节(未知来源)。这是我不明白的,在调试模式下似乎不存在

标签: c++ winapi sockets


【解决方案1】:
  1. 您没有检查第一次读取时是否正好有 8 个字节。可能会更少。
  2. 我希望这是 TCP,因为使用 UDP,您将使用第二个 recv() 读取下一个数据包。

【讨论】:

  • 确定是 TCP。现在我在主中添加了 if 条件而不是检查数据大小是否小于 8 并且它不再崩溃,无论如何我不明白为什么有这 2 个字节没有出现在日志中客户(发件人)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2010-11-13
  • 1970-01-01
  • 2011-07-11
  • 2023-03-05
  • 2012-08-29
相关资源
最近更新 更多