網路程式設計之windows/Linux比較
1、標頭檔案:
#include <winsock.h> or #include <winsock2.h>
#include <sys/socket.h>
- 新增#program comment(lib,"Ws2.lib")
- 預設windows.h檔案會包含winsock.h,當你包含winsock2.h就會衝突。要解決這個問題,需要首先包含winsock2.h,然後再包括windows.h,要注意包含的順序。
2、socket初始化與關閉:
Windows需要 WSAStartup(),closesocket(...)函式
Linux不需要初始化,結束socket用close(...)
3、型別宣告:
SOCKET
int
- 在Windows裡將SOCKET巨集定義成unsigned int
4、錯誤返回碼:
windows下getlasterror()/WSAGetLastError()/SOCKET_ERROR
linux下errno變數
- SOCKET_ERROR=-1
5、設定非阻塞:
ioctlsocket(server_socket,FIONBIO,&ul);
ioctlsocket在Linux中沒有定義,用fcntl替代即可,但要包含fcntl.h標頭檔案。
#include <fcntl.h>
fcntl(server_socket,F_SETFL, O_NONBLOCK);
6、send函式最後一個引數:
windows下一般設定為0
linux下最好設定為MSG_NOSIGNAL,禁止send()函式向系統傳送異常訊息。如果不設定,在傳送出錯後有可能會導致程式退出。
先總結這麼多吧,socket程式設計是網路程式設計中比較重要的一個部分,對理解TCP/IP協議也有一定的幫助。當然,如果是通訊的朋友僅僅知道socket是遠遠不夠的,它封裝了協議的具體實現,所以,我希望有興趣的朋友深入分析一下socket內部實現,我相信一定會對網路協議有更深入的理解。
還有想說說程式移植問題,windows和WinCE就不多說了,它們出於同門,自然有千著絲萬縷的聯絡,偶有不同也就是由於系統簡化和記憶體限制的問題。windows和Linux就不一樣了,從核心到函式,有著太多的不一樣,但是,這不妨礙聰明的人們在兩個系統平臺上進行移植操作,也在網際網路上總結了無數的精華文章。當遇到移植問題,系統不相容的問題的時候,一定要堅持,網上找解決方法,那你就站在巨人的肩膀上,如果自己找到答案那你就是那個巨人!與君共勉!