2017-05-27 28 views
-1

我有一個關於在Linux上使用c語言進行套接字編程的問題。socket編程read()函數錯誤爲什麼?

當我的客戶端程序連接到服務器程序時,有時會在read()函數中出現無法識別的錯誤。

我不確定什麼情況會導致此問題。

看起來像無限循環。程序停在那個地方,發生任何事情。

即使當我寫我這樣的代碼

int message = 1; 

while(message > 0){ 
    printf("READ ERROR"); 
    message = read(sockfd, recvBuff, sizeof(recvBuff)); 
} 

它可以打印任何東西!

正如我所想,如果出現錯誤,至少應打印READ ERROR一次。

爲什麼會出現這種情況?

+0

我不明白你的代碼。你的while()退出'cos消息不會大於1,此外,爲什麼只接收到一個被認爲不好的字符? – ThingyWotsit

+1

編譯所有警告和調試信息'gcc -Wall -Wextra -g'。 **使用調試器'gdb' **(也許還有[strace(1)](http://man7.org/linux/man-pages/man1/strace.1.html) –

+0

對不起,這是錯誤的,我編輯時,條件消息> 0 –

回答

0

仔細read(2)socket(7)Advanced Linux Programming

閱讀作爲Jesferman answeredwhile應該是while(message>0)。我假定你沒有改正這一點。

在EOF(即當遠程主機關閉或shutdown(2)插座),read可以返回0

read也可能失敗(返回-1),那麼很可能使用perror(3)檢查errno(3)

read可以阻止,如果沒有什麼可讀的。您可能需要在read之前使用poll(2)

而且,你忘了結束您printf格式\n(或叫fflush(3) ...),所以它是可能的READ ERROR坐在stdout的緩衝區。請記住,<stdio.h>是緩衝IO。另請參閱setvbuf(3)

0

問題是while的情況。您的代碼裏面沒有進入,因爲消息不大於1,但正好是1,所以條件是不正確的,從來沒有在while循環

1

要麼進入:

  • read()返回1,因爲一個字符是可利用的(原代碼)
  • 它返回零,這意味着對等已經斷開
  • 它返回-1,意味着一個錯誤,其值是可用的在errno,並且可以通過perror()被打印。

這三個條件中只有一個是錯誤,而這個錯誤並不神祕。

正如我所想,如果出現錯誤,至少應打印READ ERROR一次。

號,進入僅環有什麼東西在讀,在這種情況下,有不是讀取錯誤。因此,在循環內打印消息沒有任何意義。

相關問題