代码之家  ›  专栏  ›  技术社区  ›  Gab Royer

为什么下面的代码会让我的电脑发出嘟嘟声?

  •  1
  • Gab Royer  · 技术社区  · 14 年前

    我真的很难理解为什么这段代码让我的电脑发出哔哔声。我隔离了这段代码以产生偶尔的哔哔声,但我不知道它有什么问题。

    const int BUFFER_LENGTH = 8192;
    char buffer [BUFFER_LENGTH + 1];
    int recvResult;
    
    do
    {
        recvResult = recv(webSocket, buffer, BUFFER_LENGTH, 0);
        buffer[recvResult] = '\0';
        printf("%s", buffer);
        if (recvResult > 0)
        {
            sendResult = send(clientSocket, buffer, recvResult, 0);
        }
    }while (recvResult > 0);
    
    shutdown(webSocket, SD_SEND);
    

    为了提供一点上下文,这是一个计算机网络类,在这个类中我们必须编写代理代码。所以我要做的是倾听答案并将其转发给客户。

    我不能告诉你当我第一次听到哔哔声时我从椅子上跳了多高…

    3 回复  |  直到 14 年前
        1
  •  11
  •   icecrime    14 年前

    缓冲区可能包含 '\a' 使计算机发出哔哔声的字符。从5.2.2(字符显示语义):

    表示执行字符集中非图形字符的字母转义序列用于在显示设备上生成以下操作:

    • \(警报)在不改变激活位置的情况下产生声音或可见警报。
        2
  •  1
  •   Gab Royer    14 年前

    无论如何,找到了它,实际上是printf语句发出了意外的哔哔声!

        3
  •  1
  •   valdo    14 年前

    同意 '\a' 嘟嘟声解释。

    关于您的代码还有一点:

    recvResult = recv(webSocket, buffer, BUFFER_LENGTH, 0);
    buffer[recvResult] = '\0';
    

    注意 recvResult 如果存在I/O错误(或者如果您在非阻塞模式下工作,到目前为止没有要读取的数据),则为-1。

    在这种情况下,你会写进被禁止的记忆,那就是(该死的,我多么讨厌这个短语) 未定义的行为 . 简单地说-内存覆盖,这很糟糕。

    您应该检查套接字错误 之前 写入 buffer