C/C++WindowsからLinuxへの移行

4580 ワード

最近Socketに関するプログラムを書きましたが、windowsからlinuxに移植する必要があります.今、役に立つものを集めて整理して記録します.
 
1.ヘッダファイルwindows下winsock.hまたはwinsock 2.h;linux下netinet/in.ほとんどはここにあるh(close関数はここにあります)、sys/socket.h(in.hに含まれているので、節約できます).
 
2.Windowsを初期化するにはWSAstartupでWs 2_を起動する必要があります.32.lib、#pragma comment(lib,"Ws 2_32")を使用して、コンパイラにlibのリンクを通知する.linuxでは必要ありません.
 
3.socketwindowsの下を閉じる:closesocket()linuxの下:close()
 
4.タイプwindows下:SOCKETlinux下:int(longも使用可能、これで保証は4 byte、-1は0 xFFFFFFと書くことができます)
 
5.エラーコードwindows下getlasterror()/WSAGEtLastError();linuxでは、errnoが含まれている場合、正常に実行できなかったsocket操作は-1を返します.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!
");   return -1; }

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

コンパイルにはパラメータ-pthread:例えばg++FTPserverも必要である.cpp -pthread
 
10.IPでアドレスを定義する(sockaddr_inの構造の違い)windowsの下:addr_var.sin_addr.S_un.S_addrlinuxの下:addr_var.sin_addr.s_addrそしてWinsockで最後の32 bitのS_addrには、メモリ空間を共有するメンバー変数(他の方法で値を割り当てるのに便利)がいくつかありますが、LinuxのSocketにはこの連合はなく、32 bitのs_です.addr.4個のcharを得たIPの形(例えば127個、0個、0個と1個の計4個のchar)に出会って、WinSockは直接4個のS_を使うことができますbはS_に値を割り当てるaddrではLinuxでは,左シフト(下8 bit,共4下)で加算する方法で値を割り当てることができる.
 
11.異常処理linuxで接続が切断され、データが送信されるとsend()の戻り値が反映されるだけでなく、システムのように異常メッセージが送信され、処理しないとBrokePipeが出てプログラムが終了します.このためsend()関数の最後のパラメータはMSG_NOSIGNALは、send()関数がシステムに異常メッセージを送信することを禁止します.
 
12.2つの文字列の前の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に移植されたとき、2つのオペレーティングシステムは多くのデータ型の命名方式に大きな違いがあります.例えば、windowsの下でシンボルレスデータ型に対して一般的にU+xの方式を使っています.UINT、UCHAR、ULUONGのように、linuxの上では規則的で、unsigned+xです.また、WindowsにはDWORD、HANDLE、LPSTRなど、linuxにはないデータ型もあります.そのため、ダウンロードできる比較的役に立つヘッダファイルがあります.
 
CとC++WindowsコードをLinuxに移植すると、より多くの役に立つものがあります.http://download.csdn.net/detail/lsmallstop/7747981
Windowsデータ型をLinuxで変換するヘッダファイルと、必要に応じて直接このヘッダファイル(#include"WinToLinux.h")を導入すれば実用的です.もう1つはWindowsからLinuxのCとC++コードに移植するドキュメントの説明で、役に立ちます.
 
転載先:https://www.cnblogs.com/lxt287994374/p/3909630.html