Omzetten Van Een Windows C++ MFC Telefonie Servertoepassing Naar Linux
Total Page:16
File Type:pdf, Size:1020Kb
Academiejaar 2013–2014 Faculteit Ingenieurswetenschappen en Architectuur Valentin Vaerwyckweg 1 – 9000 Gent Omzetten van een Windows C++ MFC telefonie servertoepassing naar Linux Masterproef voorgedragen tot het behalen van het diploma van Master in de industriële wetenschappen: informatica Tibault DAMMAN Promotoren: Ann VAN OVERBERGE Ing. Filip HOSTE (MyForce) Powered by TCPDF (www.tcpdf.org) Voorwoord Vooreerst mijn dank aan iedereen bij MyForce voor een bijzonder aangename stage, ik weet niet wat ik zonder de voortdurende aanmoediging (\en, compileert het al?") gedaan zou hebben. In het bijzonder wil ik Filip Hoste en Bert Reyntjes bedanken voor hun hulp en uitleg bij de code. Daarnaast wil ik ook mijn promotor Ann Van Overberge bedanken voor het nalezen van deze scriptie en geven van bruikbare feedback. Ook aan Rudy Stoop, tweede lezer en docent C++, een woord van dank. Ten slotte dank ik ook Hannes, Arne en Bas voor hun tips en het verdragen van mijn onge- twijfeld eindeloos geklaag. Tibault Damman De Pinte, 28 augustus 2014 Omzetten van een Windows C++ MFC telefonie servertoepassing naar Linux door Tibault DAMMAN Masterproef voorgedragen tot het behalen van het diploma van Master in de industri¨ele wetenschappen: informatica Academiejaar 2013{2014 Interne promotor: Ann VAN OVERBERGE Externe promotor: Ing. Filip HOSTE (MyForce) Faculteit Ingenieurswetenschappen en Architectuur Universiteit Gent Abstract MyForce is een bedrijf dat zich specialiseert in het ontwikkelen van oplossingen voor bedrijven waar automatisatie van telefonie centraal staat, zoals bij callcenters en bureaus voor markt- onderzoek. HardwareClient is het component dat instaat voor de communicatie tussen het publieke telefonienetwerk (via ISDN en VoIP) en het interne bedrijfsnetwerk. Momenteel werkt deze software enkel op Microsoft Windows, maar de gebruikte middleware en drivers voor dit platform worden minder actief ontwikkeld dan hun Linux variant. Deze thesis heeft als doel de HarwareClient software beschikbaar te maken op Linux, om op deze manier gebruik te kunnen maken van alle nieuwe mogelijkheden die dit platform met zich meebrengt. Om dit resultaat te verkrijgen moesten de verschillen tussen Windows en Linux onderzocht worden wat betreft de drivers, de sockets, de multithreading, het aanspreken van het bestands- systeem, tot zelfs de verschillen tussen de compilers. Een groot deel van de tijd werd besteed aan het vervangen van het MFC framework, een Microsoft alternatief voor de STD library, dat bovendien een schil rond een groot deel van de Win32 functies biedt. Voorzichtigheid was ook geboden om de compatibilteit met bestaande Windowssystemen niet te breken. Trefwoorden Linux { porting { MFC { C++ { telefonie Porting a Windows C++ MFC telephony server application to Linux by Tibault DAMMAN Master thesis submitted to obtain the degree of Master of Science in Information Engineering Technology Academic year 2013{2014 Internal promotor: Ann VAN OVERBERGE External promotor: Eng. Filip HOSTE (MyForce) Faculty of Engineering and Architecture University Gent Abstract MyForce is a company specialising in the development of solutions for companies with a focus on telecommunication, such as call centres and market researchers. HardwareClient is their software component responsible for linking the public telephony network (through ISDN or VoIP) with the internal company network. Currently this software only runs on Microsoft Windows, but the used middleware and drivers for this operating system are less actively developed than their Linux counterpart. The goal of this thesis is to enable HardwareClient to run on Linux, so that it can make use of the new possibilities and increased third party support this platform offers. Various differences between Windows and Linux were researched, varying from drivers, to sockets, multithreading, file systems, and even the intricate differences between compilers. The majority of the work consisted of replacing the MFC framework, a Microsoft alternative to the C++ STD, that also offers an easy wrapper around many Win32 functions. Great care was also taken not to break compatibility with the existing Windows clients and servers. Keywords Linux { porting { MFC { C++ { telephony INHOUDSOPGAVE i Inhoudsopgave 1 Inleiding 1 2 Toolchain 2 2.1 Besturingssysteem . .2 2.2 C++ compiler en standard library . .2 2.3 Buildsystem . .2 2.3.1 CMake . .3 2.3.1.1 Cross compiling . .4 2.3.1.2 Lijst van cpp-bestanden bekomen . .5 2.4 IDE . .5 2.5 Version Control . .5 3 Middleware (Driver/SDK) installatie 6 3.1 Dialogic Powermedia HMP . .6 3.2 Aculab . .7 3.2.1 libTiNG . .8 4 MFC 9 4.1 Wat is MFC? . .9 4.2 MFC alternatieven . .9 4.2.1 Wine . 10 4.2.2 Qt . 10 4.2.3 wxWidgets . 11 4.2.4 Boost . 11 4.2.5 C++11 STD . 11 4.3 Eigen MFC implementatie . 11 5 Het porting proces 13 5.1 Overzicht van de uiteindelijke mappenstructuur . 14 6 Datatypes en -structuren 15 6.1 Datatypes . 15 6.2 Array, List en Map . 15 6.3 String . 16 6.3.1 Unicode . 17 6.3.2 Implementatie CString . 19 INHOUDSOPGAVE ii 6.3.3 Extra stringfuncties . 21 6.3.4 Unicode in praktijk . 23 6.3.4.1 Vergelijken van tekens . 24 7 Time 26 7.1 GetTickCount . 26 7.2 CTime . 27 7.3 GetSystemTime en GetLocalTime . 28 7.4 COleDateTime en COleDateTimeSpan . 29 8 IO 31 8.1 Sockets . 31 8.1.1 TCP keepalive . 31 8.1.2 Asynchrone sockets . 34 8.1.2.1 select(2) . 34 8.1.2.2 poll(2) . 34 8.1.2.3 epoll(7) . 34 8.1.2.4 libevent, libev, libuv . 35 8.1.2.5 (C++11 / boost) Asio . 35 8.2 Files . 35 8.2.1 CFile . 36 8.2.2 CFileFind . 39 8.2.3 Unicode BOM . 42 8.3 CRC-32 en Zip . 42 9 Multithreading 44 9.1 Threads . 44 9.2 Locking (critical sections en mutexen) . 44 9.2.1 CSingleLock . 44 9.2.2 Named Mutex . 45 9.3 CEvent . 46 9.4 Compiler intrinsieke functies . 47 9.5 Thread Local Storage . 48 10 Daemon 49 10.1 GetModuleFileName . 50 10.2 Bepalen of de daemon al draait . 50 10.3 Het Windowsregister . 51 11 Link met middleware 52 11.1 Importeren van functies uit bibliotheken . 52 11.1.1 set invalid parameter handler . 53 11.2 Headerconflicten . 55 11.3 Ontbrekende functionaliteit . 55 11.3.1 Dialogic file API . 56 11.3.2 NCM API . 57 11.3.3 ALGO LOUD . 57 INHOUDSOPGAVE iii 11.3.4 SR MODELTYPE . 57 11.3.5 SWMODE CTBUS SCBUS . 58 12 Struikelblokken 59 12.1 64-bit . 59 12.1.1 M X64 ................................... 59 12.1.2 Pointer als int . 59 12.1.3 sizeof(long) . 60 12.2 Het bestandssysteem . 60 12.3 Striktheid van de compiler . 61 12.4 Structured Exception Handling . 62 12.5 Problemen met macro's . 62 12.5.1 Slechte ifdefs . 63 12.6 Het nut van typename bij templates . 64 13 Varia 66 13.1 Het aantal elementen van een array op de stack . 66 13.2 StrFormatByteSize . 66 13.3 AfxIsValidAddress . 67 14 Conclusie 69 Bijlage A Installatie drivers/sdk 70 A.1 Dialogic HMP . 70 A.2 Aculab . 74 Bibliografie 77 LIJST VAN CODEFRAGMENTEN iv Lijst van codefragmenten 2.1 Verkorte versie van het gebruikte CMake projectbestand . .3 2.2 Cross compiling met CMake . .4 2.3 Bash instructie om codebestanden uit een Visual Studio project te filteren . .5 3.1 CMake - Dialogic headers en bibliotheken . .7 3.2 CMake - Aculab headers en bibliotheken . .8 3.3 CMake - libTiNG preprocessor symbool . ..