標籤:
Linux下,accept()把已等到的網路錯誤傳給建立立的串連,當作是accept()返回的錯誤。這同其他的BSD實現是不同的。為了可靠運行,應該在accept()之後檢測協議已定義的一些網路錯誤,並把這些錯誤當作EAGAIN並重試。對於TCP/IP協議來說,主要有錯誤:ENETDOWN,EPROTO,ENOPROTOOPT,EHOSTDOWN,ENONET,EHOSTUNREACH,EOPNOTSUPP和ENETUNREACH。
EAGAIN或EWOULDBLOCK
socket為非阻塞狀態並且當前沒有串連存在就會返回EAGAIN或EWOULDBLOCK。posix.1-2001允許傳回值是這兩個中的任意一個,並且不需要兩個常數的值是相同的,這樣應用程式移植的時候有更好的相容性。
EBADF
該描述符無效。
ECONNABORTED
串連已被終止。
EFAULT
addr參數不在使用者地址空間的可寫的部分。
EINTR
有效串連到達之前,系統調用被中斷。瞭解更多資訊可以參考signal(7)。
EINVAL
通訊端未偵聽串連,或地址長度是無效的(例如,是負的)。
EINVAL
(accept4())在標誌的值無效。
EMFILE
每個開啟的檔案描述符的過程已達到極限。
ENFILE
在開啟的檔案總數已達到極限的系統。
ENOBUFS, ENOMEM
沒有足夠的可用記憶體。這往往意味著記憶體配置是通過socket緩衝區的範圍有限,不是系統記憶體。
ENOTSOCK
引用一個檔案描述符,不是一個插座。
EOPNOTSUPP
引用的類型不是sock_stream插座。
EPROTO
協議錯誤。
此外,Linux accept()可能會失敗,如果:
EPERM
防火牆禁止串連。
此外,新版本Socket定義的新的網路錯誤可能被返回。不同的Linux核心可以返回其他錯誤,如enosr,esocktnosupport,eprotonosupport,etimedout。跟蹤過程中還可以看到ERESTARTSYS。
關於Linux accpet()的錯誤處理