Почему следующий код заставляет мой компьютер подавать звуковой сигнал? - PullRequest
1 голос
/ 17 ноября 2010

Мне очень трудно понять, почему этот кусок кода заставляет мой компьютер подавать звуковой сигнал. Я выделил этот раздел кода, чтобы он издал случайный звуковой сигнал, но я не вижу, в чем проблема с ним.

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 ]

11 голосов
/ 17 ноября 2010

В буфере, вероятно, содержится символ '\a', который издает звуковой сигнал компьютера. Начиная с 5.2.2 (семантика отображения символов):

Буквенные escape-последовательности, представляющие неграфические символы в наборе исполнительных символов, предназначены для выполнения действий на устройствах отображения следующим образом:

  • \ a (alert) Создает звуковое или визуальное предупреждение без изменения активной позиции.
1 голос
/ 17 ноября 2010

Согласитесь с объяснением звукового сигнала '\a'.

Еще один момент, касающийся вашего кода:

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

Обратите внимание, что recvResult будет равно -1, если возникнет ошибка ввода-вывода(или если вы работаете в неблокирующем режиме и пока не имеете данных для чтения).

В таком случае вы будете писать в запрещенную память, что (черт, как я ненавижу эту фразу) неопределенное поведение .Проще говоря - перезапись памяти, что плохо.

Вы должны проверить на наличие ошибки сокета перед записью в buffer

1 голос
/ 17 ноября 2010

Неважно, нашел его, на самом деле это был оператор printf, который время от времени издавал звуковой сигнал!

...