/ dev / tcp tidak ada di Linux

9

Saya porting kode C / pro * c dari UNIX ke Linux. Kode tersebut adalah:

#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;
}

Dalam UNIX nilai socket_id > 0di Linux itu -1. Alasannya ada di UNIX, ada a /dev/tcp. Ini tidak ada di Linux. Juga di UNIX tcpfile ini adalah file karakter khusus yang berbeda dari file normal.

Apakah ada cara untuk membuat file khusus karakter yang sama di Linux seperti di UNIX atau bagaimana melanjutkan ini lebih lanjut?

missingsemicolon
sumber
5
Apakah ada alasan mengapa Anda tidak menggunakan soket Berkeley / soket POSIX ?
jofel
ya Jofel. Dalam hal ini saya perlu memodifikasi sejumlah besar kode yang ada yang tidak layak. Saya sedang mencari pengganti / dev / tcp di Linux atau bagaimana itu harus dibuat di Linux untuk membuatnya berfungsi seperti di Unix. Berikut ini adalah informasi tentang / dev / tcp di Unix.
missingsemicolon
1
Bagaimana Anda mengkompilasi perangkat lunak Anda? AFAIK di Linux, XTI / TLI hanya didukung oleh beberapa perpustakaan tambahan seperti Linux Fast Stream dari OpenSS7 atau emulator seperti iBCS . Tidak ada cara untuk membuat / dev / tcp di Linux. Anda mungkin menemukan / dev / tcp digunakan dari bash, tetapi dalam kasus ini hanya relic yang memberitahu bash untuk membuka soket tcp. Perangkat tidak benar-benar ada.
jofel
cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet menjalankan file binary test Ada cara untuk membuat file karakter tcp di bawah / dev menggunakan perintah mknod tcp c <x> <y>. Dalam unix entri perangkat untuk tcp adalah 42,2. itu adalah perintah file (file / dev / tcp) menunjukkan "karakter khusus (42/2)" di mana x = 42 dan y = 2. Tetapi dengan entri yang sama saya buat di Linux sebagai mknod tcp c 42 2.again socket_id adalah -1. Di sini masalahnya adalah entri perangkat untuk digunakan Linux.
missingsemicolon
1
@smilebhuff Tidak cukup untuk membuat node, seseorang di kernel harus bertanggung jawab untuk itu - yang bukan kasus di Linux.
glglgl

Jawaban:

18

t_open()dan yang terkait /dev/tcpdan merupakan bagian dari antarmuka TLI / XTI , yang kehilangan pertempuran untuk TCP / IP API ke soket BSD.

Di Linux, ada beberapa /dev/tcpmacam. Ini bukan file asli atau perangkat kernel. Ini adalah sesuatu yang khusus disediakan oleh Bash , dan hanya ada untuk pengalihan. Ini berarti bahwa bahkan jika seseorang ingin membuat fasilitas di-kernel /dev/tcp, itu akan disembunyikan dalam penggunaan interaktif 99% [*] dari waktu oleh shell.

Solusi terbaik sebenarnya adalah beralih ke soket BSD. Maaf.

Anda mungkin bisa membuat lapisan emulasi strxnet XTI berfungsi, tetapi Anda lebih baik meluangkan waktu untuk melepaskan XTI. Itu adalah API mati, tidak didukung tidak hanya di Linux, tetapi juga pada BSD, termasuk OS X.

(Omong-omong, perpustakaan strxnet bahkan tidak akan membangun pada BSD, karena itu tergantung pada LiS , komponen dari kernel Linux. Bahkan tidak configurepada sistem BSD atau OS X saham, tampaknya karena itu juga tergantung pada GNU sed.)

[*] Saya mendasarkan dugaan liar ini pada fakta bahwa Bash adalah shell default untuk pengguna non-root di semua distro Linux yang saya gunakan. Karena itu Anda harus keluar dari cara Anda di Linux, sebagai aturan, untuk mendapatkan sesuatu selain Bash.

Warren Young
sumber
Warren terima kasih atas masukan Anda. Maaf saya sangat baru dengan konsep soket ini dan konsep API. Tolong kosongkan dengan pertanyaan saya. Apa yang Anda maksud dengan "strxnet XTI emulation latyer" kami baru-baru ini menginstal salah satu paket strxnet (strxnet-0.9.2.10.tar) untuk mendapatkan beberapa openss7 libraries / headerfiles. Apa yang bisa saya lakukan lebih banyak dengan itu?
missingsemicolon
Saya tidak pernah menggunakannya sendiri, tetapi dari pemeriksaan cepat tarball, sepertinya begitu terinstal, ia memberikan lapisan emulasi XTI. Anda seharusnya hanya dapat mengarahkan kompiler Anda padanya -Idan -Lmenandai dan berharap itu bekerja. Tetapi jika tidak, saya tidak akan membuang banyak waktu untuk itu.
Warren Young
Saya tahu tentang -I dan -L yang masing-masing menyertakan header / perpustakaan. Tapi apa yang harus saya lakukan di sini dengan -I / -L? maaf lagi jika pertanyaan saya salah.
missingsemicolon
1
Itu tergantung di mana paket menginstal file. Temukan file perpustakaan,: libstrxnet.so.*direktori itulah yang Anda gunakan -L. Temukan xti.h: meneruskan direktori itu ke -I. Anda juga akan membutuhkan -lstrxnetminimal. Intinya: lihat strxnet docs.
Warren Young
Warren, itulah yang telah saya lakukan selama kompilasi. silakan lihat langkah-langkah yang saya berikan pada perintah sebelumnya. Perpustakaan ini memiliki fungsi t_open (). Tetapi masalahnya bukan pada fungsi ini. Masalahnya dengan / dev / tcp yang t_open coba buka.
missingsemicolon