Question

Je suis sur le point de développer des outils liés aux sockets en C ++ et j'aimerais que le logiciel soit aussi portable que possible entre Windows et Linux dès le début (le rendre portable plus tard est délicat.)

J'ai consulté différentes bibliothèques. Il en existe une pour C ++ dans alhem.net et parmi Bien sûr il y a boost :: asio. boost :: asio semble très prometteur mais constituerait une très grande dépendance pour des applications aussi petites.

Cela vaut-il même la peine d’écrire les choses moi-même ou devrais-je simplement utiliser une bibliothèque? Si je le fais moi-même, quels seraient les principaux pièges?

Était-ce utile?

La solution

Les winsocks ne sont pas très compatibles avec les sockets Posix:

  • Dans Winsocks, un socket est de type SOCKET. Sur Posix, il s’agit simplement d’un descripteur de fichier (int) sur lequel vous pouvez effectuer des appels normaux read() et write().
  • Ils ne renvoient pas les erreurs de la même manière.
  • Ils ne prennent pas en charge certaines options sur recv() et send().
  • Vous devez initialiser et unitialiser la bibliothèque Winsocks avec deux fonctions spéciales.
  • Je ne pense pas que vous puissiez fermer les sockets Windows avec shutdown() ou close(). C'est quelque chose comme closesocket() à la place.

Il doit y avoir plus de différences, mais c'est ce dont je me souviens maintenant. Si vous voulez la portabilité avec Winsocks, vous aurez une petite bibliothèque pour fermer un socket, imprimer un message d'erreur, etc.

J'irais probablement avec boost::asio, personnellement (je ne l'ai jamais utilisé, cependant).

Autres conseils

J'ai développé quelques emballages portables autour des sockets. Assurez-vous de ne pas emprunter la voie sans issue qui est constituée d'événements WinSock2. À part cela, à mon avis, les plus grandes différences sont les suivantes:

  • pour démarrer la mise en réseau sous Windows, vous devez appeler ::WSAStartup(). Pour l'arrêter sous Windows, exécutez ::WSACleanup(); sous Linux, ne faites rien,
  • close() sous Linux est closesocket() sous Windows,
  • Les tailles de tampon par défaut diffèrent entre les pilotes et les systèmes d'exploitation, assurez-vous donc de les définir avec SO_RCVBUF et SO_SNDBUF,
  • .
  • SO_REUSEADDR vole l’adresse sous Windows, permet une réouverture fréquente sous Linux; vous voudrez probablement seulement utiliser ce drapeau sous Linux,
  • rendant une socket non bloquante utilise ::ioctlsocket() sous Windows, ::fcntl() sous Linux,
  • les fichiers d'en-tête sont différents, <sys/socket.h> et amis sous Linux, <WinSock.h> sous Windows,
  • pour être portable, le moyen le plus simple est probablement d'utiliser ::select() d'attendre l'arrivée des données,
  • fd_set sont totalement différents sous Windows / Linux; cela n’est pertinent que si vous avez besoin d’optimiser l’initialisation de ::recvfrom() s, par exemple lors de l’ajout / la suppression de sockets arbitraires,
  • Sous Windows, tout thread suspendu au socket est publié avec un code d'erreur lorsque le socket est fermé. Sous Linux, le thread reste en attente. Si le thread bloque le socket avec par exemple ::sendto(), vous pouvez envisager d’utiliser <=> pour libérer le thread bloqué sous Linux.

Tout le reste dont j'avais besoin venait de sortir du l & # 229; da.

Jetez un coup d'œil à " Adaptive Communications Environment " Bibliothèque (ACE): (page d'accueil ACE) Il fournit de belles abstractions et beaucoup de flexibilité, le tout dans une bibliothèque portable prenant en charge Windows, MacOS et Linux. La courbe d’apprentissage est un peu raide, mais j’en tire un très bon rapport qualité-prix.

Quelle quantité de socket utiliserez-vous? J'ai créé plusieurs applications où le niveau de la socket était plutôt élevé (ouvert, lu, écrit) et fonctionnait parfaitement entre Windows et Linux. Si c'est plus que cela, allez-y avec boost.

Honnêtement, je préférerais utiliser boost :: asio. Si vous voulez vraiment vous familiariser avec l’API de sockets, vous pouvez utiliser l’API de sockets standard de type BSD sous Windows et Linux. Linux, vous n’avez pas de bibliothèque distincte sur laquelle vous lier.

Jetez un coup d'œil à cela ... http://sourceforge.net/projects/cpp- prises /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top