2010-05-04 6 views
1

Je suis actuellement en train de porter du code C++ pour Windows vers le standard C++. Donc, j'essaie de trouver des alternatives pour les fonctions spécifiques de Windows.Portage de la plate-forme Windows C++ vers POSIX (Linux) C++ - WSAGetLastError()

J'ai eu très peu de chance de trouver une fonction C++ standard qui peut m'aider à remplacer la fonction spécifique de WSAGetLastError(). WSGetLastError() renvoie les numéros d'erreur pour les erreurs qui se produisent avec les sockets dans Windows.

Donc je me demandais si quelqu'un était au courant d'un moyen de remplacer cette fonction en C++ standard?

Un moyen d'obtenir différents numéros d'erreur pour différents résultats de connexion/dissonçage d'une socket serait suffisant.

+2

Il n'y a rien de tel que "Windows C++", et vous n'essayez pas non plus de le porter sur "Standard C++". Vous essayez de transférer votre programme d'une plate-forme Windows vers une plate-forme POSIX. Ni l'un ni l'autre n'ont quelque chose à voir avec le C++ standard. – jalf

+1

Vous devriez remarquer que la documentation pour toutes les fonctions de socket vous indique où ils stockent leurs informations d'erreur. Par exemple: http://linux.die.net/man/2/bind. Vous allez quand même lire toute cette documentation car les fonctions de socket fonctionnent différemment sur différents systèmes d'exploitation. Les fonctions de socket sous Linux ne se comportent pas nécessairement de la même manière que les fonctions ayant le même nom sous Windows. Portez une attention particulière aux cas de coin. –

+0

Merci pour les informations supplémentaires, très apprécié –

Répondre

9

Il n'y a pas de fonctions C++ standard supportant les sockets. Cependant, les fonctions de socket POSIX doivent toutes définir la variable errno en cas d'erreur - il vous suffit de l'examiner - elle doit être déclarée en errno.h.

+0

Cheers, merci! –

+1

Si vous utilisez des connexions non bloquantes, vous devrez également utiliser 'getsockopt (socket, SOL_SOCKET, SO_ERROR, ...);' pour obtenir l'état 'connect()'. Et sachez que 'errno' n'est pas modifié en cas d'opérations réussies - vous pouvez donc vouloir le mettre à zéro avant chaque opération. – caf

+2

La définition d'errno sur zéro n'est pas une bonne pratique. Vous devriez plutôt l'examiner seulement si la valeur de retour de l'appel de fonction indique une erreur. –

0

Je mettrais en communication vers Boost.ASIO ce qui résoudra les différences de mise en réseau et vous donnera probablement de meilleures performances en utilisant des appels asynchrones et des E/S superposées. Lorsque vous avez terminé, le code fonctionne partout.