/ dev / tcp không có trong Linux


9

Tôi đang chuyển mã C / pro * c từ UNIX sang Linux. Mã này là:

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

Trong UNIX, giá trị của socket_id là > 0trong Linux -1. Lý do là trong UNIX, có một /dev/tcp. Điều này không có trên Linux. Ngoài ra trong UNIX tcptệp này là tệp đặc biệt ký tự khác với tệp thông thường.

Có cách nào để tạo tệp đặc biệt cùng ký tự trong Linux như trong UNIX không hoặc làm cách nào để tiếp tục điều này?


5
Có một lý do tại sao bạn không sử dụng ổ cắm Berkeley / ổ cắm POSIX ?
jofel

vâng, Jofel. Trong trường hợp đó tôi cần sửa đổi số lượng lớn mã hiện tại không khả thi. Tôi đang tìm kiếm sự thay thế của / dev / tcp trong Linux hoặc cách nó được tạo trong Linux để làm cho nó hoạt động như trong Unix. Sau đây là thông tin về / dev / tcp trong Unix.
missingsemicolon

1
Làm thế nào để bạn biên dịch phần mềm của bạn? AFAIK trên Linux, XTI / TLI chỉ được hỗ trợ bởi một số thư viện bổ sung như Linux Fast Stream từ OpenSS7 hoặc trình giả lập như iBCS . Không có cách nào đơn giản là tạo / dev / tcp trên Linux. Bạn có thể tìm thấy / dev / tcp được sử dụng từ bash, nhưng trong trường hợp này, nó chỉ là một bản sao để bash mở ổ cắm tcp. Thiết bị không thực sự tồn tại.
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet đã thực hiện kiểm tra tệp nhị phân Có một cách để tạo tệp ký tự tcp dưới / dev bằng lệnh mknod tcp c <x> <y>. Trong unix, các mục thiết bị cho tcp là 42,2. đó là lệnh tập tin (file / dev / tcp) hiển thị "ký tự đặc biệt (42/2)" trong đó x = 42 và y = 2. Nhưng với các mục tương tự tôi đã tạo trong Linux là mknod tcp c 42 2.again socket_id là -1. Vấn đề ở đây là các mục thiết bị được sử dụng Linux.
missingsololon

1
@smilebhuff Không đủ để tạo nút, ai đó trong kernel phải chịu trách nhiệm cho nó - đó không phải là trường hợp của Linux.
glglgl

Câu trả lời:


18

t_open()và liên kết của nó /dev/tcpvà như vậy là một phần của giao diện TLI / XTI , đã thua cuộc chiến về API TCP / IP với các ổ cắm BSD.

Trên Linux, có một /dev/tcploại. Nó không phải là một tập tin thực sự hoặc thiết bị kernel. Đó là thứ được cung cấp đặc biệt bởi Bash và nó chỉ tồn tại để chuyển hướng. Điều này có nghĩa là ngay cả khi người ta tạo ra một /dev/tcpcơ sở trong nhân , nó sẽ bị che khuất trong việc sử dụng tương tác 99% [*] thời gian bằng vỏ.

Giải pháp tốt nhất thực sự là chuyển sang ổ cắm BSD. Lấy làm tiếc.

Bạn có thể có thể làm cho lớp mô phỏng XTI của strxnet hoạt động, nhưng tốt hơn hết là bạn nên dành thời gian để thoát khỏi XTI. Đó là một API chết, không được hỗ trợ không chỉ trên Linux mà còn trên BSD, bao gồm cả OS X.

(Nhân tiện, thư viện strxnet thậm chí sẽ không được xây dựng trên BSD, bởi vì nó phụ thuộc vào LiS , một thành phần của nhân Linux. Nó thậm chí sẽ không configurephụ thuộc vào hệ thống BSD hoặc OS X chứng khoán GNU sed.)

[*] Tôi dựa trên dự đoán hoang dã này về thực tế rằng Bash là trình bao mặc định cho người dùng không phải root trong tất cả các bản phân phối Linux mà tôi đã sử dụng. Do đó, bạn phải đi ra khỏi Linux, theo quy định, để có được thứ gì đó không phải là Bash.


Warren cảm ơn cho đầu vào của bạn. Xin lỗi, tôi rất mới với các khái niệm API và lập trình socket này. Xin trần với câu hỏi của tôi. Ý của bạn là "latx giả lập XTI của strxnet" gần đây chúng tôi đã cài đặt một trong các gói strxnet (strxnet-0.9.2.10.tar) để có được một số thư viện / thư mục tiêu đề. Tôi có thể làm gì hơn với điều đó?
missingsemicolon

Tôi chưa bao giờ sử dụng nó, nhưng từ một cuộc kiểm tra nhanh về tarball, có vẻ như một khi nó được cài đặt, nó cung cấp một lớp mô phỏng XTI. Bạn chỉ cần có thể trỏ trình biên dịch của mình vào nó -Ivà gắn -Lcờ và mong đợi nó hoạt động. Nhưng nếu không, tôi sẽ không dành nhiều thời gian cho nó.
Warren Young

Tôi biết về -I và -L tương ứng bao gồm các tiêu đề / thư viện. Nhưng chính xác thì tôi phải làm gì ở đây với -I / -L? xin lỗi lần nữa nếu câu hỏi của tôi sai
missingsemicolon

1
Điều đó phụ thuộc vào nơi gói cài đặt các tập tin. Tìm tệp thư viện , libstrxnet.so.*: thư mục đó là những gì bạn chuyển đến -L. Tìm xti.h: chuyển thư mục đó đến -I. Bạn cũng sẽ cần -lstrxnettối thiểu. Dòng dưới cùng: xem các tài liệu strxnet.
Warren Young

Warren, đó là những gì tôi đã làm trong quá trình biên soạn. xin vui lòng xem các bước tôi đã đưa ra trong lệnh trước. Thư viện này có hàm t_open (). Nhưng vấn đề không nằm ở chức năng này. Vấn đề là với / dev / tcp mà t_open đang cố mở.
missingsemicolon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.