首先看一下函數socket的定義:
int socket
(
int domain, /* address family (for example, AF_INET) */
int type, /* SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW */
int protocol /* socket protocol (usually 0) */
)
/*RETURNS
*A socket descriptor, or ERROR
*/
socket()調用成功,返回socket descriptor,可以是從0~max;調用失敗,返回-1。
所以從函數定義上看,socket=0的情況完全可以發生。
然而我們在實際運動過程中,經常使用
if(socket > 0)
{
//socket有效時,進行函數處理
}
這是因爲通常情況下,socket返回的是大於0的情況,導致我們有一種經驗上的錯覺:socket總是大於0。
爲什麼?
在linux系統中,
descriptor 0、1、2是三個特殊的描述符:
stdin = 0;
stdout = 1;
stderr = 2;
系統總是默認將0、1、2分配給這標準輸入輸出,所以,socket一般分配的值都不會是這三個。
假設,如果出現這種情況:
int sockfd = 0; //initialize sockfd with 0
close(sockfd); //close "socket" without check
sockfd = socket(AF_INET, SOCK_STREAM, 0); //what will happen here
sockfd 會等於什麼?由於錯誤操作,stdin被關閉了,這時就會出現socket=0的情況。