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