2009-02-02 10 views
2

Est-il possible de joindre deux sockets? Par exemple, si un processus agit comme un routeur de messages entre 2 autres processus à un moment donné, le fait de pouvoir s'écarter permettrait d'économiser un paquet d'E/S de socket. Cela semble être possible, mais je ne l'ai jamais entendu.Rejoindre 2 sockets?

Si c'est possible, est-ce possible sur Linux ET Windows? Si oui, y a-t-il différents mécanismes utilisés pour mettre cela en place?

BTW: Je viens de trouver ceci:

Linux splice() system call.

Cela semble proche de ce que je demande, mais est-il un équivalent de Windows (en supposant bien sûr que cela fonctionne sur la prise FD est aussi bien)?

Répondre

2

AFAIK, Ce n'est pas possible.

Un exemple simple: si vos processus s'exécutent sur trois machines différentes, comment la machine proxy peut-elle s'écarter sans impliquer une redirection de trafic au niveau TCP/UDP/quel que soit le niveau? L'épissure n'est pas une solution, elle optimise simplement le transfert d'E/S en évitant les copies de mémoire inutiles mais, en tout cas, vous avez besoin d'un processus qui cyclise sur l'entrée et appelle l'épissure pour transférer les données à la sortie. les sockets sont de vraies sockets réseau, les données doivent passer deux fois à travers la carte réseau).

LLP, Andrea

+0

Je me suis rendu compte qu'après avoir posté ceci que vraiment faire ceci exigerait le support à la couche de tcp/ip ... Si un routeur pourrait envoyer un paquet hors bande au client qui a dit "passer sans problème toutes les adresses de destination pour xxxx pour cette prise "... alors ça marcherait ... – dicroce

1

La réponse courte est Non.

La réponse légèrement plus longue est généralement pas. L'appel système splice() est spécifique à Linux et n'est pas défini pour les sockets. Si était à définir pour les sockets, alors ce serait un moyen de connecter un fichier mappé en mémoire à ou à partir d'un socket de flux. Ce ne serait pas bidirectionnel. Les dieux savent seulement ce qui existe sur Windows dans ce domaine.

La réponse excessivement geek est Eh bien, vous pourriez étendre le noyau OS, mais ... qui pourrait ne pas être ce que vous voulez. Si aucune adresse distante des deux sockets PF_INET ou PF_INET6 n'est locale au nœud, le routeur transfèrera toujours les paquets entre les deux hôtes distants, chacun d'entre eux ayant un socket 5-tuple référençant votre hôte de routeur. Et non, je vais expliquer les arts sombres de l'usurpation d'ARP/ND6 pour contourner ce problème.

1

J'ai programmé quelque chose comme ça dans le passé. En supposant, vous êtes le programmeur pour les trois processus, c'est possible mais difficile. Si vous avez une connexion de socket A et une connexion de socket B, vous prenez l'information de A, l'envoyez à B et demandez à B d'envoyer une demande de connexion à A. Cela nécessitera un peu de codage, mais cela devrait fonctionner. Cela a fait pour moi. J'espère que cela fonctionne! Bonne chance!