programme socket Windows pour Unix Porting: Alternative pour les API de winsock32 dans unix

StackOverflow https://stackoverflow.com/questions/3042543

  •  27-09-2019
  •  | 
  •  

Question

Dans la programmation Socket, comment un fil Unix recevoir un événement FERMER Prise d'un client si la connexion est fermée?

Y at-il de l'API qui informera le fil unix sur l'événement CLOSE reçu?

Comme dans Windows, nous avons API WSAEnumNetworkEvents qui obtient la notification d'événements pour un descripteur de socket spécifié. Quelle sera l'API équivalent utilisé dans la programmation socket Unix?

S'il vous plaît fournir l'aide pour la requête.

Était-ce utile?

La solution

Vous pouvez suivre l'événement de fermeture lors de l'exécution de lecture. La prise est fermée lorsque read Renvoie 0 (parler de « prises Berkeley » bien sûr).

// EDIT: Utilisez poll ou select d'attendre un événement de se produire (arrivée de données, fermeture socket ...).

Autres conseils

Désolé, pas de temps pour une réponse, mais il faut vérifier Guide de Beej à la programmation réseau

Pensiez-vous sur l'utilisation de boost :: asio , de cette façon vous pouvez au moins le code entre linux et windows. Les frais généraux ne sont pas que grand par rapport à des prises nues et vous avez l'avantage d'une meilleure sémantique. De nombreuses parties de code de boost se sont envolés dans la norme C ++ de sorte que le code est de qualité assez élevé.

Ceci implique la réécriture de votre logiciel ce qui pourrait ne pas être une option. D'autre part, vous auriez une base de code commune à maintenir.

libevent vous permettra de recevoir un événement quand il y a des données sur la prise ou lorsque le besoins de douille pour être fermés. Plus précisément, vous voulez configurer la prise pour vous informer sur un événement lecture (EV_READ) et dans la vérification de la fonction de rappel si la valeur de retour de recv est 0, ce qui indique que la prise à l'autre extrémité a l'arrêt proprement ou -1, ce qui indique une erreur. Dans le premier cas, où la valeur de retour est 0, vous voulez fermer le socket. Dans le second cas, où le retour de -1 indique une sorte de « erreur », ce que vous faites dépend de la nature de l'erreur. Par exemple recv peut retourner -1 et errno ensemble à EINTR indiquant que la fonction a été interrompue, par exemple par l'intermédiaire d'une interruption SIGUSR1. Comment gérez-vous cela dépend de ce que vos besoins d'application à faire.

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