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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VC下Debug和Release區別——網路文摘
- TCP socket和web socket的區別TCPWeb
- WebSocket 和 Socket 的區別Web
- Linux和Windows下網路測試工具的安裝使用(iperf)LinuxWindows
- Linux下開發-fcntl和ioctl的區別Linux
- 網路通訊——socket(TCP/IP).Http,同步和非同步的區別TCPHTTP非同步
- socket在python下的使用Python
- linux和windows系統的區別LinuxWindows
- 兩個路徑下的iptables的區別
- linux下QT在windows下執行LinuxQTWindows
- socket 實現的 web 伺服器在 Windows 下的讀寫問題Web伺服器Windows
- Xshell在Windows和Linux間檔案的上傳和下載WindowsLinux
- http、socket、tcp的區別和聯絡?HTTPTCP
- 認清Python下==和is的區別Python
- Linux和windows系統之間的區別LinuxWindows
- Vagrant 在 Windows 下的使用Windows
- SAP 用的到Date [網路文摘]
- 【轉】linux下命令su與su - 的區別。Linux
- linux下和windows下如何防止php***薦LinuxWindowsPHP
- 在Windows下啟動Linux(轉)WindowsLinux
- Linux環境下的Socket程式設計Linux程式設計
- WebSocket 與 Socket 的區別Web
- socket與http的區別HTTP
- 怎樣在不同網路安全需求下建立DMZ區
- CRF++在Windows下以及Linux下的安裝及測試方法CRFWindowsLinux
- bin下的bpl 與 redist下的bpl 區別Redis
- linux核心和windows核心的一些區別LinuxWindows
- 前端文摘:最全的CSS2.1和CSS3+的區別一覽前端CSSS3
- Linux 下匿名訪問windows 下的ftpLinuxWindowsFTP
- Apache+php在windows下的安裝和配置ApachePHPWindows
- CVSNT在Windows下的安裝和使用(轉)Windows
- Http和Socket連線區別HTTP
- 在K8S中,常用的CNI網路外掛有哪些?並說一下它們的工作原理和區別。K8S
- linux下和windows下如何防止php木馬LinuxWindowsPHP
- noVNC在Windows下的應用VNCWindows
- Elasticsearch在Windows下的安裝ElasticsearchWindows
- Subversion在windows下的安裝Windows
- nginx在windows下的使用三NginxWindows