socket在windows下和linux下的區別的網路文摘

ForTechnology發表於2011-08-04
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 Socket 程式設計 windowsLinux程式碼移植遇到的問題 1、一些常用函式的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2、網路 ------ 轉載 & 修改(待整理) socket相關程式從windows移植到linux下需要注意的 1)標頭檔案 windowswinsock.h/winsock2.h linuxsys/socket.h 錯誤處理:errno.h 2)初始化 windows下需要用WSAStartup linux下不需要 3)關閉socket windowsclosesocket(...) linuxclose(...) 4)型別 windowsSOCKET linuxint 如我用到的一些巨集: #ifdef WIN32 typedef int socklen_t; typedef int ssize_t; #endif #ifdef __LINUX__ typedef int SOCKET; typedef unsigned char BYTE; typedef unsigned long DWORD; #define FALSE 0 #define SOCKET_ERROR (-1) #endif 5)獲取錯誤碼 windowsgetlasterror()/WSAGetLastError() linuxerrno變數 6)設定非阻塞 windowsioctlsocket() linuxfcntl() 7)send函式最後一個引數 windows下一般設定為0 linux下最好設定為MSG_NOSIGNAL,如果不設定,在傳送出錯後有可 能會導致程式退出。 8)毫秒級時間獲取 windowsGetTickCount() linuxgettimeofday() 3、多執行緒 多執行緒: (win)process.h --(linux)pthread.h _beginthread --&gt pthread_create _endthread --&gt pthread_exit



關於這個話題網上流傳的是一個相同的版本,就是那個第一項是標頭檔案的區別,但後面列出的標頭檔案只有#include沒有(估計是原版的在不斷轉載的過程中 有人不小心忘了把尖括號轉義,讓瀏覽器當html標記解析沒了)的那個。現在整理了一下,以後也會不斷補充內容。 1)標頭檔案 windowswinsock.hwinsock2.h linuxnetinet/in.h(大部分都在這兒),unistd.hclose函式在這兒),sys/socket.h(在in.h裡已經包含 了,可以省了) 2)初始化 windows下需要用WSAStartup啟動Ws2_32.lib,並且要用#pragma comment(lib,"Ws2_32")來告知編譯器連結該lib linux下不需要 3)關閉socket windowsclosesocket(...) linuxclose(...) 4)型別 windowsSOCKET linuxint(我喜歡用long,這樣保證是4byte,因為-1我總喜歡寫成0xFFFF 5)獲取錯誤碼 windowsgetlasterror()/WSAGetLastError() linux下,未能成功執行的socket操作會返回-1;如果包含了errno.h,就會設定errno變數 6)設定非阻塞 windowsioctlsocket() linuxfcntl(),需要標頭檔案fcntl.h 7)send函式最後一個引數 windows下一般設定為0 linux下最好設定為MSG_NOSIGNAL,如果不設定,在傳送出錯後有可能會導致程式退出 8)毫秒級時間獲取 windowsGetTickCount() linuxgettimeofday() 9)多執行緒 windows下包含process.h,使用_beginthread_endthread linux下包含pthread.h,使用pthread_createpthread_exit 10)IP定義一個地址(sockaddr_in的結構的區別) windowsaddr_var.sin_addr.S_un.S_addr linuxaddr_var.sin_addr.s_addr 而且Winsock裡最後那個32bitS_addr也有幾個以聯合(Union)的形式與它共享記憶體空間的成員變數(便於以其他方式賦值),而 LinuxSocket沒有這個聯合,就是一個32bits_addr。遇到那種得到了是4charIP的形式(比如127一個,0一個,0一個 1一個共四個char),WinSock可以直接用4S_b來賦值到S_addr裡,而在Linux下,可以用邊向左移位(一下8bit,共四下)邊 相加的方法賦值。 11)異常處理 linux下當連線斷開,還發資料的時候,不僅send()的返回值會有反映,而且還會像系統傳送一個異常訊息,如果不作處理,系統會出 BrokePipe,程式會退出。為此,send()函式的最後一個引數可以設MSG_NOSIGNAL,禁止send()函式向系統傳送異常訊息。

 

socketwindows下和linux下的區別

1)標頭檔案
windows
winsock.h/winsock2.h
linux
sys/socket.h    錯誤處理:errno.h

2)初始化
windows
下需要用WSAStartup

WSADATA wsaData;

        err = WSAStartup(0x202,&wsaData);   if ( err != 0 )
{
          return 0;
    }
   else if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )   //
檢測是否支援這個版本的socket
    {
          WSACleanup( );
        return 0;
    }

對應的退出清理用WSACleanup( );
linux
下不需要

3)關閉socket
windows
closesocket(...)
linux
close(...)

4)socket型別
windows
SOCKET
linux
int

5)獲取錯誤碼
windows
WSAGetLastError()

linuxerrno變數

extern int errno;
        int geterror(){return errno;}

6)設定非阻塞
windows
ioctlsocket(server_socket,FIONBIO,&ul);     int ul = 1
linux
fcntl(server_socket,F_SETFL, O_NONBLOCK);   


7)send
函式最後一個引數
windows
下一般設定為0
linux
下必須是後幾個引數用到的socket中,值最大的數(整型)加1 (另一種說法是設定為MSG_NOSIGNAL


8)
毫秒級時間獲取
windows
GetTickCount()
linux
gettimeofday()

9)編譯連線

windowsws2_32.lib
linux

連線是使用引數:-lstdc
       
執行時需要libstdc++.so.5,可在/usr/lib目錄中建立一個連結。

10)Socket操作錯誤返回值

都為SOCKET_ERROR,他的值是-1

11)異常處理

windows下沒有對send()的異常處理,最後一個引數無效,寫0就可以了。

linux

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

12)WSA巨集

windowsWSA相關的操作

linuxWSA相關的操作在Linux不必要,直接去掉即可


13)
多執行緒
多執行緒: (win)process.h --(linux)pthread.h
_beginthread --&gt pthread_create
_endthread --&gt pthread_exit

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-704142/,如需轉載,請註明出處,否則將追究法律責任。

相關文章