socket返回值爲0的問題

一、問題描述

socket_id爲0,1,2的是給標準輸入輸出用的。當調用socket()來創建套接字時,返回值確實0,這時候如果進行讀寫,就是直接打印到控制檯了。

二、什麼情況下socket返回值爲0

1. 如果我們調用close(0)之後,socket_id = 0的便處於“空閒”狀態。用戶利用socket函數創建套接字時,便可能會將0分配給新創建的socket。

這種情況下,一般是套接字聲明時沒初始化,使用了默認值0。比如:

//全局變量
int fd;
if (fd >= 0)
{
    close(fd); //close(0)
}

所以一般套接字句柄要初始化爲 -1

//全局變量
int fd = -1;
if (fd >= 0)
{
    close(fd); 
    fd = -1;
}

2. 編碼時不注意運算符優先級關係導致
比如下面的代碼:

while(g_pWanInfo->sockfd = networkConnect(SERVER_IP_DEFAULT, SERVER_PORTP_DEFAULT) < 0)
{
}

小於號的優先級大於賦值,所以返回的句柄值會先和0進行比較,比較的結果爲0,然後賦值給fd。這時候fd = 0

改爲下面的就OK了:

while((g_pWanInfo->sockfd = networkConnect(SERVER_IP_DEFAULT, SERVER_PORTP_DEFAULT)) < 0)
{
}

其實第二種情況是精簡代碼是要注意的問題。

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