一、問題描述
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)
{
}
其實第二種情況是精簡代碼是要注意的問題。