天天看點

about porting

搞了幾個跨linux與windows的項目,碰到很多問題,記下來,以供查考。另外,因為水準的原因,肯定錯誤在所難免,請讀者一定指正。

  如無其它說明,本文所指linux均表示2.6核心linux,gcc編譯器,windows均表示windows xp系統,visual studio 2005 sp1編譯環境。

  下面大概分幾個方面進行羅列:

  linux要包含

#include <sys/socket.h> 

#include <netinet/in.h> 

#include <netdb.h> 

#include <arpa/inet.h> 

等頭檔案,而windows下則是包含 #include <winsock.h> 

  linux中socket為整形,windows中為一個socket。

  linux中關閉socket為close,windows中為closesocket。

  linux中有變量socklen_t,windows中直接為int。

  因為linux中的socket與普通的fd一樣,是以可以在tcp的socket中,發送與接收資料時,直接使用read和write。而windows隻能使用recv和send。

  設定socet選項,比如設定socket為非阻塞的。linux下為

flag = fcntl (fd, f_getfl); 

fcntl (fd, f_setfl, flag | o_nonblock); 

,windows下為 flag = 1; 

ioctlsocket (fd, fionbio, (unsigned long *) &flag); 

  當非阻塞socket的tcp連接配接正在進行時,linux的錯誤号為einprogress,windows的錯誤号為wsaewouldblock。

  linux下面,檔案換行是"\n",而windows下面是"\r\n"。

  linux下面,目錄分隔符是"/",而windows下面是"\"。

  linux與windows下面,均可以使用stat調用來查詢檔案資訊。但是,linux隻支援2g大小,而windows隻支援4g大小。為了支援更大的檔案查詢,可以在linux環境下加_file_offset_bits=64定義,在windows下面使用_stat64調用,入參為 struct __stat64。

  linux中可根據stat的st_mode判斷檔案類型,有s_isreg、s_isdir等宏。windows中沒有,需要自己定義相應的宏,如

#define s_isreg(m) (((m) & 0170000) == (0100000)) 

#define s_isdir(m) (((m) & 0170000) == (0040000)) 

  linux中删除檔案是unlink,windows中為deletefile。

  linux中,time_t結構是32位的無符号整形。而windows中,time_t結構是64位的整形。如果要在windows始time_t為32位無符号整形,可以加宏定義,_use_32bit_time_t。

  linux中,sleep的機關為秒。windows中,sleep的機關為毫秒。即,linux下sleep (1),在windows環境下則需要sleep (1000)。

  windows中的timecmp宏,不支援大于等于或者小于等于。

  windows中沒有struct timeval結構的加減宏可以使用,需要手動定義:

#define microseconds (1000 * 1000) 

#define timeradd(t1, t2, t3) do { \ 

(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \ 

(t3)->tv_usec = (t1)->tv_usec + (t2)->tv_usec % microseconds; \ 

if ((t1)->tv_usec + (t2)->tv_usec > microseconds) (t3)->tv_sec ++; \ 

} while (0) 

#define timersub(t1, t2, t3) do { \ 

(t3)->tv_sec = (t1)->tv_sec - (t2)->tv_sec; \ 

(t3)->tv_usec = (t1)->tv_usec - (t2)->tv_usec; \ 

if ((t1)->tv_usec - (t2)->tv_usec < 0) (t3)->tv_usec --, (t3)->tv_usec += microseconds; \ 

  linux下可以直接使用system來調用外部程式。windows最好使用winexec,因為winexec可以支援是打開還是隐藏程式視窗。用winexec的第二個入參指明,如sw_show/sw_hide。

  linux為srandom和random函數,windows為srand和rand函數。

  linux為snprintf,windows為_snprintf。

  同理,linux中的strcasecmp,windows為_stricmp。

  linux下面,通常使用全局變量errno來表示函數執行的錯誤号。windows下要使用getlasterror ()調用來取得。

  這些函數或者宏,windows中完全沒有,需要使用者手動實作。

  atoll

long long 

atoll (const char *p) 

int minus = 0; 

long long value = 0; 

if (*p == '-') 

minus ++; 

p ++; 

while (*p >= '0' && *p <= '9') 

value *= 10; 

value += *p - '0'; 

return minus ? 0 - value : value; 

gettimeofday

#if defined(_msc_ver) || defined(_msc_extensions) 

#define epochfiletime 11644473600000000ui64 

#else 

#define epochfiletime 11644473600000000ull 

#endif 

struct timezone 

int tz_minuteswest; 

int tz_dsttime; 

}; 

int 

gettimeofday (struct timeval *tv, struct timezone *tz) 

filetime ft; 

large_integer li; 

__int64 t; 

static int tzflag; 

if (tv) 

getsystemtimeasfiletime (&ft); 

li.lowpart = ft.dwlowdatetime; 

li.highpart = ft.dwhighdatetime; 

t = li.quadpart; /* in 100-nanosecond intervals */ 

t -= epochfiletime; /* offset to the epoch time */ 

t /= 10; /* in microseconds */ 

tv->tv_sec = (long) (t / 1000000); 

tv->tv_usec = (long) (t % 1000000); 

if (tz) 

if (!tzflag) 

_tzset (); 

tzflag++; 

tz->tz_minuteswest = _timezone / 60; 

tz->tz_dsttime = _daylight; 

return 0; 

}

簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。 

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/geniusalex/archive/2012/10/09/2716689.html

繼續閱讀