PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ Sockets Plattformübergreifen



TheHawk
27-04-2007, 11:10
Was brauch ich um in C++ platformunabhaängig sockets programmieren zu können? es sollte so sein das wenn man von linux auf windows bzw. umgelehrt kopiert, das keine änderung am quelltext erforderlich ist sondern einfach kompiliert und gelinkt werden kann.

inge
27-04-2007, 11:46
du musst immer abfragen welches system grad kompilieren.
z.B. so:


#ifdef WIN32
#include <winsock.h>
#endif

TheHawk
27-04-2007, 13:31
aber die befehle bei winsock sind doch auch uterschiedlich in gegensatz zu linux, oder?

RHBaum
27-04-2007, 15:14
Ja, also muesstest du da immer mit den compilerflags arbeiten ....

Alternativ kannst du eine Lib verwenden, die dir die netzwerkschnittstellen auf ein allgemeineres konzept (Streams z.b.) abstrahiert. die machen es intern natuerlich genu so ...

die QT z.b. bietet sowas. Eine lib die nur Netzwerkschnittstellen auf Protokollebene abstrahiert faellt mir im moment ned wirklich ein. Auf hoeherer ebene mit Corba oder so gaebs sicher was.

Ansonsten wissen die anderen vielleicht noch mehr ....

Ciao ...

locus vivendi
27-04-2007, 16:18
Es gibt z.B. noch die portablen Bibliotheken für Netzwerkprogrammierung ACE und Asio:
http://www.cs.wustl.edu/~schmidt/ACE.html
http://asio.sourceforge.net/

ACE gibt es schon ziemlich lange, dementsprechend viel Arbeit ist dort eingeflossen und es ist ziemlich ausgereift. ACE wurde auch auf sehr viele Platformen portiert.
Asio ist ein "Newcomer", wurde aber dennoch bereits für anspruchsvolle Anwendungen benutzt, wie auf der Mailingliste zu lesen war. Asio wird möglicherweise in den zweiten Bericht für Bibliothekserweiterungen ("TR2") des C++-Komitees aufgenommen - es gibt dafür einen konkreten Vorschlag. Damit ist es auch ein Kandidat für die Aufnahme in den C++-Standard selber.
Qt wurde ja bereits genannt. Qt hat natürlich den Vorteil dass es auf den meisten GNU/Linux Distributionen z.B. bereits vorinstalliert ist. Wenn du dein Progamm weitergeben möchtest brauchtst du dich dann nicht mehr darum kümmern das der Benutzer eine weitere Bibliothek installiert. Außerdem sind verschieden Qt Versionen in der Vergangenheit immer lange binärkompatibel gewesen was auch sehr angenehm ist.

Fazit Qt, ACE und Asio sind vermutlich alle für dich geeignet und du solltest schauen welche Bibliothek am besten zu dir (und deinen Anforderungen) passt.

TheHawk
27-04-2007, 17:28
Ich will in meinen Spiel, gecodet in C++, einen HTTP-Server integrieren.

jay-t
30-04-2007, 06:02
@ inge ACK!

Wieso mit Kanonen auf Mücken ballern und für Sockets eine Bibliothek verwenden.
Nur wegen mehreren Plattformen?

Ist doch ganz einfach. Hier mal ein Beispiel wie so was aussehen kann:



#if _WIN32

#include <winsock2.h>
#include <ws2tcpip.h>

int init_winsock (void)
{
WORD wVersionRequested;
WSADATA wsaData;

wVersionRequested = MAKEWORD (2, 2);

if (WSAStartup (wVersionRequested, &wsaData))
{
return (FALSE);
}

if (LOBYTE (wsaData.wVersion) != 2 || HIBYTE (wsaData.wVersion) != 2)
{
return (FALSE);
}

return (TRUE);
}

#endif


int close_socket (int sock)
{
int error;

#if _WIN32
error = closesocket (sock);
#else
error = close (sock);
#endif

return (error);
}


int main ()
{
/* irgendwas ... */


/* Windows socket API öffnen */

#if _WIN32
if (! init_winsock ())
{
printf ("Kann Windows socket API nicht öffnen!\n");
exit (1);
}
#endif


/* Dein socket Zeugs... */


if (close_socket (socket) == -1)
{
printf ("Kann socket nicht schließen!\n");
}

#if _WIN32
WSACleanup (); /* Windows socket API schließen */
#endif
}



Und das mit dem Linken geht dann so:


./configure LIBS="$LIBS -L../lib -lwsock32"

Bei MINGW funktioniert das ohne Probleme.

gorba
30-04-2007, 11:02
Habs genauso gemacht wie jay-t ausser, dass es ein multicast socket sein musste. Falls du also muslticast-socket Code brauchst der Portabel ist, kann ich den Code posten.

PS: Hab das ganze dann mit mingw32 für win kompiliert.