Comment puis-je refuser une connexion socket en C?

Si je veux accepter une connexion, j’appelle accept , mais comment puis-je refuser une connexion?

Dans un client echo de socket de travail, j’ai cette instruction if. Dans le serveur d’écho, comment puis-je amener le client d’écho à atteindre cette instruction printf ?

 ... if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { printf("Connecting failed\n"); return 1; } ... 

À ma connaissance, ce n’est pas comme ça que TCP fonctionne. L’appel accept(..) retournera toujours avec les détails du client. Il n’y a aucun moyen de jeter un coup d’ œil sur la connexion et de refuser sélectivement.

La façon dont vous le faites maintenant est en fait la bonne façon: accepter puis fermer. Si vous avez une autre structure de message en plus de cette couche, vous pouvez créer un “message de rejet” personnalisé. Cette option dépend complètement de votre cas d’utilisation.

Si vous recherchez un rejet sur la base d’une adresse IP, ce n’est pas dans le domaine de votre application. C’est le travail de votre pare-feu (comme le dit @Bart Friederichs). De cette façon, la demande ne touchera même pas la stack TCP.


En fait, je veux uniquement une connexion sur ce port particulier. Toute autre connexion devrait idéalement échouer de manière très évidente.

Ne laissez pas l’appel accepter dans votre stream de contrôle. Votre programme n’attendra une connexion socket que lorsque vous attendez d’ accept .

Pour obtenir le comportement souhaité (n’accepter qu’une connexion à la fois, les autres clients tentant doivent échouer), vous avez le choix.

  • Vous pouvez fermer votre socket d’écoute après avoir accepté une connexion. Recréez votre socket d’écoute après la fermeture de la connexion acceptée.

  • Vous pouvez fermer les connexions nouvellement établies si une connexion est déjà en cours. Si vous souhaitez que le client voie une réinitialisation TCP, la plupart des stacks TCP en déclencheront une si vous activez l’option Linger avec un délai d’attente égal à 0.

    struct linger lo = { 1, 0 };
    setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
    close(s);

Dans les API de socket standard sur la plupart des plates-formes, il n’y a aucun moyen de rejeter une connexion. Vous devez accept() la connexion, puis la fermer immédiatement si vous ne le souhaitez pas.

L’exception à cette règle est la fonction WSAAccept() spécifique à WSAAccept() . Il fournit un rappel qui permet à une application de décider, connexion par connexion, si une connexion doit être acceptée, rejetée ou conservée dans la queue du backlog.

Ça pourrait être utile

  1. pour fermer le socket du serveur d’écoute après avoir accept() avec succès la connexion client et
  2. pour le rétablir une fois la connexion client établie, quelle qu’en soit la raison.