/ dev / tcp non presente in Linux


9

Sto trasferendo il codice C / pro * c da UNIX a Linux. Il codice è:

#define __NFDBIT       (8 * sizeof(unsigned long))
#define __FD_SETSIZ    1024
#define __FDSET_LONG   (__FD_SETSIZ/__NFDBIT)
typedef struct {
    unsigned long fds_bits [__FDSET_LONG];
} __ernel_fd_set;

typedef __ernel_fd_set           fd_set_1;
int main()
{
    fd_set_1 listen_set;
    int listen_sd;
    int socket_id;
    FD_ZERO(&listen_set);
    socket_id = t_open("/dev/tcp", O_RDWR|O_NONBLOCK, (struct t_info *) 0);
    if ( socket_id <0 )
    {
        exit(FAILURE);
    }
    return 0;
}

In UNIX il valore di socket_id è > 0in Linux lo è -1. Il motivo è in UNIX, c'è un /dev/tcp. Questo non è presente su Linux. Anche in UNIX questo tcpfile è un file speciale di carattere diverso dal file normale.

Esiste un modo per creare file speciali dello stesso personaggio in Linux come in UNIX o come procedere ulteriormente?


5
C'è un motivo per cui non si utilizzano prese Berkeley / prese POSIX ?
jofel,

si Jofel. In tal caso, devo modificare una grande quantità di codice esistente che non è fattibile. Sto cercando la sostituzione di / dev / tcp in Linux o come dovrebbe essere creato in Linux per farlo funzionare come in Unix. Di seguito sono riportate informazioni su / dev / tcp in Unix.
missingsemicolon,

1
Come compilate il vostro software? AFAIK su Linux, XTI / TLI è supportato solo da alcune librerie extra come Linux Fast Stream di OpenSS7 o emulatori come iBCS . Non c'è modo di creare semplicemente / dev / tcp su Linux. Puoi trovare / dev / tcp usato da bash, ma in questo caso è solo un relitto che dice a bash di aprire un socket tcp. Il dispositivo non esiste davvero.
jofel,

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet test del file binario eseguito Esiste un modo per creare il file di caratteri tcp in / dev usando il comando mknod tcp c <x> <y>. In unix le voci del dispositivo per tcp sono 42,2. questo è il comando file (file / dev / tcp) mostra "carattere speciale (42/2)" dove x = 42 e y = 2. Ma con le stesse voci che ho creato in Linux come mknod tcp c 42 2.again socket_id è -1. Qui il problema sono le voci del dispositivo da utilizzare Linux.
missingsemicolon,

1
@smilebhuff Non è sufficiente creare il nodo, qualcuno nel kernel deve esserne responsabile - il che non è il caso di Linux.
glglgl,

Risposte:


18

t_open()e i suoi associati /dev/tcpe simili fanno parte dell'interfaccia TLI / XTI , che ha perso la battaglia per le API TCP / IP nei socket BSD.

Su Linux, esiste una /dev/tcpsorta di. Non è un vero file o dispositivo del kernel. È qualcosa di appositamente fornito da Bash ed esiste solo per i reindirizzamenti. Ciò significa che anche se si dovesse creare una struttura nel kernel /dev/tcp, la shell verrebbe mascherata nell'uso interattivo il 99% [*] delle volte.

La soluzione migliore è davvero quella di passare alle prese BSD. Scusate.

Potresti riuscire a far funzionare il livello di emulazione XTI di strxnet , ma è meglio dedicare il tuo tempo a scendere da XTI. È un'API morta, non supportata non solo su Linux, ma anche sui BSD, incluso OS X.

(A proposito, la libreria strxnet non si baserà nemmeno sui BSD, perché dipende da LiS , un componente del kernel Linux. Non sarà nemmeno configuresu un sistema BSD o OS X stock, apparentemente perché dipende anche da GNU sed.)

[*] Baso questa ipotesi selvaggia sul fatto che Bash è la shell predefinita per gli utenti non root in tutte le distribuzioni Linux che ho usato. Pertanto, per ottenere qualcosa di diverso da Bash, è necessario fare di tutto per Linux.


Warren grazie per i tuoi input. Mi dispiace, sono molto nuovo di questi concetti di programmazione socket e API. Per favore, nudo con le mie domande. Cosa intendi con "latx di emulazione XTI di strxnet" di recente abbiamo installato uno dei pacchetti di strxnet (strxnet-0.9.2.10.tar) per ottenere alcune delle librerie / file di header di openss7. Cosa posso fare di più?
missingsemicolon

Non l'ho mai usato da solo, ma da un rapido esame del tarball, sembra che una volta installato, fornisca un livello di emulazione XTI. Dovresti solo essere in grado di puntare il compilatore con -Ie -Lflag e aspettarti che funzioni. Se così non fosse, non ci perderei molto tempo.
Warren Young,

So di -I e -L che devono includere rispettivamente le intestazioni / librerie. Ma cosa devo fare esattamente con -I / -L? scusami ancora se la mia domanda è sbagliata.
missingsemicolon

1
Dipende da dove il pacchetto ha installato i file. Trova il file della libreria libstrxnet.so.*: quella directory è ciò a cui passi -L. Trova xti.h: passa quella directory a -I. Avrai anche bisogno -lstrxnetdi almeno. In conclusione: consultare i documenti strxnet.
Warren Young,

Warren, è quello che ho fatto durante la compilazione. si prega di vedere i passaggi che ho dato nel comando precedente. Questa libreria ha la funzione t_open (). Ma il problema non è con questa funzione. Il problema è con / dev / tcp che t_open sta tentando di aprire.
missingsemicolon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.