C/C++ Windows移植到Linux

近期寫了有關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++代碼移植的文檔說明,也很有用。

發佈了67 篇原創文章 · 獲贊 19 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章