Domanda

È possibile unire due socket?

Ad esempio, se un processo agisce come un router di messaggi tra altri 2 processi ad un certo punto, essere in grado di fare da parte salverebbe un sacco di socket IO. Sembra che dovrebbe essere possibile, ma non ho mai nemmeno sentito di farlo!

Se è possibile, è possibile su Linux E Windows? In tal caso, vengono utilizzati diversi meccanismi per configurarlo?

A proposito: ho appena trovato questo:

Chiamata di sistema Linux splice ().

Questo sembra vicino a quello che sto chiedendo (supponendo ovviamente che funzioni anche su socket FD), ma esiste un equivalente di Windows?

È stato utile?

Soluzione

AFAIK, Non è possibile.

Un semplice esempio: se i tuoi processi vengono eseguiti su tre macchine diverse, come potrebbe la macchina proxy spostarsi senza coinvolgere il reindirizzamento del traffico a TCP / UDP / qualunque livello?

splice non è una soluzione, semplicemente ottimizza il trasferimento di I / O evitando inutili copie di memoria ma, in ogni caso, è necessario un processo che scorre sull'input e chiama splice su " transfer " dati da emettere (e se i socket sono socket di rete reali, i dati devono passare due volte attraverso la scheda di rete).

LLP, Andrea

Altri suggerimenti

La risposta breve è No .

La risposta leggermente più lunga è Non in generale . La splice() chiamata di sistema è specifica di Linux e non è definita per i socket. Se fosse da definire per i socket, sarebbe un modo per connettere un file mappato in memoria ao da un socket di flusso. Non sarebbe bidirezionale. Gli dei sanno solo cosa esiste su Windows in quest'area.

La risposta eccessivamente geniale è Beh, potresti estendere il kernel del sistema operativo, ma ... potrebbe non essere quello che vuoi. Se nessuno degli indirizzi remoti dei due PF_INET o PF_INET6 socket è locale-nodo, il router inoltrerà comunque i pacchetti tra i due host remoti, ognuno dei quali ha un socket 5-tupla che fa riferimento al proprio host router. E no, non spiegherò le arti oscure dello spoofing ARP / ND6 per aggirare quel problema.

Ho programmato qualcosa del genere in passato. Supponendo che tu sia il programmatore di tutti e tre i processi, è possibile ma complicato. Se si dispone della connessione socket A e della connessione socket B, si prendono le informazioni da A, le si invia a B e si fa in modo che B invii una richiesta di connessione ad A. Ciò richiederà un po 'di codifica, ma dovrebbe funzionare. Lo ha fatto per me. Spero che funzioni! Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top