2010-11-17 61 views
1

我很難理解爲什麼這段代碼會讓我的電腦發出嗶聲。我已經將這段代碼隔離爲偶爾發出嘟嘟聲的代碼,但我不明白它有什麼問題。爲什麼下面的代碼會讓我的電腦發出嗶聲?

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); 

爲了給出一點上下文,這是一個計算機網絡類,我們必須編寫代理。所以我在做的是聽取答案,並簡單地將其轉發給客戶。

我不能告訴你我有多高跳出我的椅子當我第一次聽到蜂鳴聲...

回答

11

緩衝區可能包含'\a'焦炭這使得計算機的蜂鳴聲。從5.2.2(字符顯示語義):

表示執行字符集的字符的非圖形字母轉義序列旨在如下以產生在顯示設備上的操作:

  • \一個(警報)產生在不改變活動位置的情況下發出聲音或視覺警報。
+0

是啊,我剛剛發現這一點。對此毫無頭緒! – 2010-11-17 17:06:43

1

沒關係,發現它,它實際上是printf語句,它正在做一個偶然的嗶聲!

+0

即時興趣,如何?我不能讓我的電腦揚聲器與'printf(「\ a」)嗶嗶'我做錯了什麼? – Newbie 2010-11-17 17:10:26

+0

我不知道,從我讀過的printf(「\ a」)應該會讓你的電腦發出嗶嗶聲... – 2010-11-17 17:14:57

+0

@Newbie:並非所有的操作系​​統都支持蜂鳴聲。 – fredoverflow 2010-11-17 17:18:53

1

同意'\a'蜂鳴解釋。

有關您的代碼還有一點:

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

注意recvResult將爲-1,如果有一個I/O錯誤(或者,如果你在非阻塞模式下工作,沒有數據讀取至今)。

在這種情況下,你會寫入禁止的內存,這是(該死的,我怎麼恨這句話)未定義的行爲。簡單地說 - 內存覆蓋,這是不好的。

你應該前檢查插座錯誤寫入buffer

+0

確實你是對的! – 2010-11-17 18:03:39

相關問題