Windows和Linux下socket的區別

2021-06-27 02:59:48 字數 1425 閱讀 5955



1.標頭檔案

windows下winsock.h或winsock2.h

linux下netinet/in.h(大部分都在這兒),unistd.h(close函式在這兒),sys/socket.h(在in.h裡已經包含了,可以省了)

2.初始化

windows下需要用wsastartup啟動ws2_32.lib,並且要用#pragma comment(lib,"ws2_32")來告知編譯器鏈結該lib.

linux下不需要

3.關閉socket

windows下closesocket()

linux下close()

4.型別

windows下socket

linux下int(我喜歡用long,這樣保證是4byte,因為-1我總喜歡寫成0xffff)

5.獲取錯誤碼

windows下getlasterror()/wsagetlasterror()

linux下,未能成功執行的socket操作會返回-1; 如果包含了errno.h,就會設定errno變數

6.設定非阻塞

windows下ioctlsocket()

linux下fcntl(),需要標頭檔案fcntl.h

7.send函式最後乙個引數

windows下一般設定為0

linux下最好設定為msg_nosignal,如果不設定,在傳送出錯後有可能會導致程式退出

8.毫秒級時間獲取

windows下gettickcount()

linux下gettimeofday()

9.多執行緒

windows下包含process.h,使用_beginthread和_endthread

linux下包含pthread.h,使用pthread_create和pthread_exit

10.用ip定義乙個位址(sockaddr_in的結構的區別)

windows下addr_var.sin_addr.s_un.s_addr

linux下addr_var.sin_addr.s_addr

而且winsock裡最後那個32bit的s_addr也有幾個以聯合(union)的形式與它共享記憶體空間的成員變數(便於以其他方式賦值),而linux的socket沒有這個聯合,就是乙個32bit的s_addr.遇到那種得到了是4個char的ip的形式(比如127乙個,0乙個,0乙個和1乙個共四個char),winsock可以直接用4個s_b來賦值到s_addr裡,而在linux下,可以用邊向左移位(一下8bit,共四下)邊相加的方法賦值.

11.異常處理

linux下當連線斷開,還發資料的時候,不僅send()的返回值會有反映,而且還會像系統傳送乙個異常訊息,如果不作處理,系統會出brokepipe,程式會退出.為此,send()函式的最後乙個引數可以設msg_nosignal,禁止send()函式向系統傳送異常訊息.

windows和linux下socket程式設計的不同

windows windows 標頭檔案的區別 include include windows 初始化的區別 windows 宣告socket socket型別 windows socket關閉 closesocket windows socket操作錯誤返回值 socket error windo...

windows和linux下的sleep之比較

include include include using namespace std int main int argc,char argv ace debug lm notice,d n ace os sleep ace time value 0,1 1000 ace debug lm noti...

windows和linux下打包python程式

一 windows下用py2exe打包python程式生成exe檔案 1 py2exe是一種python發布的打包工具,可以把python指令碼轉換成windows下的可執行程式,不需要安裝python便可執行。3 編寫例程 新建乙個資料夾my py2exe,編寫hello.py程式 hello.p...