C 伺服器端編碼心得

2021-06-21 22:19:36 字數 1000 閱讀 4760

很久以前寫的,最近來了兩個做c++的兄弟,感覺有必要共享一下:

1. 用斷言巨集來檢測程式的邏輯錯誤。分析一下程式core掉的原因,絕大部分是因為空指標或者無效指標引發的,而絕大部空指什和無效指標是因為程式的邏輯錯誤導至的。

因此,在除錯版中用斷言巨集來檢測邏輯錯誤,是乙個很有效的方式。 

以下是我程式裡面的一段**: 

//如果坐位不為空 

if (pseat != null) 

else  } 

2. 過度的空指標檢測,會導至bug的抗藥性。有人說,不就是空指標嗎?這還不簡單,我一行**就把他給滅了。

但正如我第一條所說,空指標,有時候只是表像,過度的空指標檢測,有可能只是暫時隱藏了bug,等你發現問題的時候,也許,離真正的bug越來越遠了。

如果你實在不能確實會遇到什麼情況,那就把斷言巨集和空指標檢測一起加上吧,在測試的時候,如果出了問題,再認真分析一下程式的邏輯。

對戰伺服器是我維護的,從去年上線到現在,一共core掉過三次,三次都是未檢測空指標,第一次,在斷言巨集裡面core了,我發現乙個邏輯錯誤,但還是沒做空指標檢測。第二次,還是在同乙個地方core,我發現乙個非常嚴重,隱藏得很深的邏輯錯誤,還是未加空指標檢測,但再未出過問題。

第三次,是忘了對客戶端的資料做校驗, 加上空指標檢測就ok了。

坦白地說,這樣的,就是非常依懶於你的測試和**邏輯的嚴謹,並且,你可能在測試的時候,發現許多之前以前不可能發現的事情:新增了乙個錯誤的斷言巨集。 

//通過plr->getseat() 一定會返回乙個合法的座位號,同時getseat()沒有任何理由輸入乙個合法的坐位而返回乙個空的或者錯誤的 seat 指標 

//但大家也看到了,我還是做了空指什處理,這也算是對當時急著上線,測試不允分的一種妥協. 

seat * shooter = getseat(plr->getseat()); 

assert(shooter != null); 

if(shooter == null || shooter->turn == false) 

socket伺服器端

伺服器 include winsock2.h include string.h include stdio.h include time.h include stdarg.h include stdlib.h pragma comment lib,ws2 32 void errexit const ...

kerberos伺服器端

1.安裝tcl wget tar zvxf tcl8.5.12 src.tar.gz cd tcl8.5.12 cd unix configure make make install 3.解壓 tar xvf krb5 1.10.3 signed.tar tar zvxf krb5 1.10.3.t...

C tcp伺服器端

伺服器端 include stdafx.h include winsock2.h pragma comment lib,ws2 32.lib include using namespace std int tmain int argc,char ar 建立套接字 sserver socket af ...