Maison  >  Questions et réponses  >  le corps du texte

c++ - Plusieurs processus écoutent le même port en même temps. Différentes applications peuvent-elles écouter le même port ?

Le modèle de

nginx est connu pour être un maître-ouvrier

曾经蜡笔没有小新曾经蜡笔没有小新2698 Il y a quelques jours1069

répondre à tous(3)je répondrai

  • 黄舟

    黄舟2017-05-31 10:39:23

    Il devrait s'agir de plusieurs processus réutilisant un seul socket en même tempssocket

    不过在现代linux中,多个socket同时监听同一个端口也是可能的,在Nginx 1.9.1以上版本也支持这一行为

    linux 3.9以上内核支持SO_REUSEPORT选项,即允许多个socket bind/listen在同一个端口上。这样,多个进程就可以各自申请socket监听同一个端口,当数据来时,内核做负载均衡,唤醒监听的其中一个进程处理,用法类似于setsockopt(listener, SOL_SOCKET, SO_REUSEPORT, &option, sizeof(option))

    采用SO_REUSEPORT选项可以有效地解决epoll惊群问题,具体测试可以看看在下写的例子:ThunderingHerdTest.cpp

    有关SO_REUSEPORT选项的讨论可参看 The SO_REUSEPORT socket option,关于题主的疑虑,文中这句话可以作为解答:

    To prevent unwanted processes from hijacking a port that has already been bound by a server using SO_REUSEPORT, all of the servers that later bind to that port must have an effective user ID that matches the effective user ID used to perform the first bind on the socket.

    即不是任意进程都可以绑定在同一个端口上的,只有effective user ID相同才可以

    关于NginxSO_REUSEPORT

    Cependant, dans Linux moderne, il est possible que plusieurs sockets écoutent le même port en même temps. Ceci est également pris en charge dans Nginx 1.9.1. et plus. Un acte 🎜 🎜linux 3.9Le noyau ci-dessus prend en charge l'option SO_REUSEPORT, qui permet plusieurs socket bind/listen< /code>sur le même port. De cette façon, plusieurs processus peuvent chacun demander à socket d'écouter le même port. Lorsque les données arrivent, le noyau effectue un équilibrage de charge et réveille l'un des processus d'écoute. L'utilisation est similaire à setsockopt(écouteur, SOL_SOCKET, SO_REUSEPORT, &option, sizeof(option))🎜 🎜L'utilisation de l'option SO_REUSEPORT peut résoudre efficacement le problème du troupeau tonitruant epoll Pour des tests spécifiques, vous pouvez voir l'exemple écrit ci-dessous : ThunderingHerdTest.cpp🎜. 🎜Pour une discussion sur l'option SO_REUSEPORT, veuillez vous référer à L'option socket SO_REUSEPORT Concernant les doutes du questionneur, cette phrase de l'article peut être utilisée comme réponse : 🎜
    🎜Pour empêcher des processus indésirables de détourner un port qui a déjà été lié par un serveur utilisant SO_REUSEPORT, tous les serveurs qui se lient ultérieurement à ce port doivent avoir un ID utilisateur effectif qui correspond à l'ID utilisateur effectif utilisé pour effectuer la première lier sur la prise.🎜
    🎜C'est-à-dire qu'aucun processus ne peut être lié au même port, uniquement si l'ID utilisateur effectif est le même🎜 🎜Pour les discussions sur Nginx et SO_REUSEPORT, veuillez consulter Nous augmentons la productivité grâce à SO_REUSEPORT dans NGINX 1.9.1🎜

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-31 10:39:23

    Celui qui a le plus petit pid devrait être le maître.

    répondre
    0
  • 漂亮男人

    漂亮男人2017-05-31 10:39:23

    Une seule application a plusieurs processus écoutant le même port, et le socket est partagé

    répondre
    0
  • Annulerrépondre