socket=0的異常分析

首先看一下函數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的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章