NO IMAGE

近期寫了有關Socket的程式,需要從windows移植到linux。現把有用的東東收集整理記錄下來。

 

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變數(strerror(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,或CreateThread等
linux下包含pthread.h,使用pthread_create和pthread_exit

例如:

Windows:

if(CreateThread(NULL, 0, ProcessTread, (void*)&clientSockINF, 0, &dwThreadId) == NULL)
{
  printf("error:CreateThread failed!\n");
  return -1;
} 

 Linux:

if (pthread_create(&thread, NULL, ProcessTread, (void*)&clientSockINF))
{
printf("error:CreateThread failed!\n");
return -1;
}

編譯時還需帶引數-pthread:例如 g  FTPserver.cpp -pthread

 

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()函式向系統傳送異常訊息。

 

12.比較兩個字串前n個字元

windows:stricmp,strnicmp

linux:strcasecmp,strncasecmp

 

13.當前工作目錄有關的函式

windows: GetCurrentDirectory(獲取當前工作目錄),SetCurrentDirectory(改變當前工作目錄)

linux: getcwd,chdir

 

14.setsockopt函式

windows:

bool optval = TRUE;
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&optval,sizeof(optval))

linux:

struct timeval optval;
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&optval,sizeof(optval))

 

15.關於路徑分割符“/”和“\”:
“\”路徑分隔符在linux 上不支援,需要都改為“/”

 

  Windows程式移植到Linux上時,兩個作業系統對很多資料型別的命名方式區別很大,比如windows下對於無符號資料型別一般用 U x的方 式,像UINT、UCHAR、ULONG,而linux上就要中規中矩,都是unsigned  x;另外,還有一些資料型別是windows有,而linux沒有的,像DWORD、HANDLE、LPSTR等等。因此下面有一個比較有用的標頭檔案,可下載。

 

  C和C Windows程式碼移植到Linux的更多有用的東東:http://download.csdn.net/detail/lsmallstop/7747981

  其中包含兩個: 一個windows資料型別在Linux下進行轉換的標頭檔案,在需要時直接引入此標頭檔案(#include “WinToLinux.h”)即可,比較實用。另一個是從Windows向Linux的C和C 程式碼移植的文件說明,也很有用。