socket在windows下和linux下的區別的網路文摘
關於這個話題網上流傳的是一個相同的版本,就是那個第一項是標頭檔案的區別,但後面列出的標頭檔案只有#include沒有(估計是原版的在不斷轉載的過程中 有人不小心忘了把尖括號轉義,讓瀏覽器當html標記解析沒了)的那個。現在整理了一下,以後也會不斷補充內容。 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()函式向系統傳送異常訊息。
1)標頭檔案 2)初始化 WSADATA wsaData; err =
WSAStartup(0x202,&wsaData); if ( err != 0 ) 對應的退出清理用WSACleanup( ); 3)關閉socket 4)socket型別 5)獲取錯誤碼 linux下errno變數 extern int errno; 6)設定非阻塞
9)編譯連線 windows下ws2_32.lib 連線是使用引數:-lstdc 10)Socket操作錯誤返回值 都為SOCKET_ERROR,他的值是-1 11)異常處理 windows下沒有對send()的異常處理,最後一個引數無效,寫0就可以了。 linux下 當連線斷開,還發資料的時候,不僅send()的返回值會有反映,而且還會像系統傳送一個異常訊息,如果不作處理,系統會出BrokePipe,程式會退 出。為此,send()函式的最後一個引數可以設定MSG_NOSIGNAL,禁止send()函式向系統傳送異常訊息。 12)WSA巨集 windows下WSA相關的操作 linux下WSA相關的操作在Linux不必要,直接去掉即可
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-704142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python:windows和linux下multiprocessing模組建立程序的區別PythonWindowsLinux
- Linux和Windows下網路測試工具的安裝使用(iperf)LinuxWindows
- TCP socket和web socket的區別TCPWeb
- socket在python下的使用Python
- linux和windows系統的區別LinuxWindows
- Xshell在Windows和Linux間檔案的上傳和下載WindowsLinux
- Linux和windows系統之間的區別LinuxWindows
- socket 實現的 web 伺服器在 Windows 下的讀寫問題Web伺服器Windows
- 認清Python下==和is的區別Python
- http、socket、tcp的區別和聯絡?HTTPTCP
- CRF++在Windows下以及Linux下的安裝及測試方法CRFWindowsLinux
- Lazarus在Win和Linux下的計時Linux
- Linux和Windows有啥區別?Linux基礎LinuxWindows
- Vagrant 在 Windows 下的使用Windows
- Linux的優缺點,Linux與windows的區別LinuxWindows
- Linux下su與su -命令的本質區別Linux
- Java方法鏈呼叫以及在JVM和安卓DalvikVM下的區別JavaJVM安卓
- WebSocket 與 Socket 的區別Web
- windows下netstat及網路檢視工具的使用Windows
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- (給科普一下)老街華納娛樂(hn0066.com)Linux和Windows的區別是什麼?LinuxWindows
- Elasticsearch 在Linux下的安裝部署和配置ElasticsearchLinux
- Linux中“>”和“>>”的區別Linux
- 在Linux下製作Linux&windows啟動盤LinuxWindows
- noVNC在Windows下的應用VNCWindows
- nginx在windows下的使用三NginxWindows
- 在K8S中,常用的CNI網路外掛有哪些?並說一下它們的工作原理和區別。K8S
- bin下的bpl 與 redist下的bpl 區別Redis
- Windows和Linux系統下的Conda環境遷移WindowsLinux
- 在Linux中,tomcat和nginx的區別是什麼?LinuxTomcatNginx
- Jtti:linux下訊號量和互斥鎖有哪些區別?JttiLinux
- Windows 系統下常用的八個網路配置命令Windows
- Linux系統下網路配置Linux
- Linux下必須知道的網路命令都有哪些?Linux
- Linux 核心和 Windows 核心有什麼區別?LinuxWindows
- 無線網路wifi和wlan有什麼區別?無線網路wifi和wlan的區別詳解WiFi
- urllib庫在python2和python3環境下的使用區別Python
- Nginx在Linux下的安裝NginxLinux
- 在Linux中,Linux核心和Shell有何區別?Linux