/ dev / tcp ไม่มีอยู่ใน Linux


9

ฉันกำลังย้ายรหัส C / pro * c จาก UNIX ไปยัง Linux รหัสคือ:

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

ใน UNIX ค่าของ socket_id คือในลินุกซ์มันเป็น> 0 เหตุผลที่อยู่ในระบบปฏิบัติการยูนิกซ์มี-1 /dev/tcpสิ่งนี้ไม่ปรากฏบน Linux นอกจากนี้ใน UNIX tcpไฟล์นี้เป็นไฟล์พิเศษของตัวละครซึ่งแตกต่างจากไฟล์ปกติ

มีวิธีใดที่จะสร้างไฟล์พิเศษของอักขระตัวเดียวกันใน Linux เช่นเดียวกับใน UNIX หรือจะดำเนินการต่อไปอีกหรือไม่?


5
มีเหตุผลที่คุณไม่ใช้ซ็อกเก็ต Berkeley / POSIX ซ็อกเก็ตหรือไม่?
กรกฎาคม

ใช่ Jofel ในกรณีนี้ฉันต้องแก้ไขโค้ดที่มีอยู่จำนวนมากซึ่งไม่สามารถทำได้ ฉันกำลังมองหาการแทนที่ / dev / tcp ใน Linux หรือวิธีที่มันควรสร้างใน Linux เพื่อให้ทำงานได้เหมือนใน Unix ต่อไปนี้เป็นข้อมูลเกี่ยวกับ / dev / tcp ใน Unix
missingsemicolon

1
คุณรวบรวมซอฟต์แวร์ของคุณอย่างไร? AFAIK บน Linux, XTI / TLI รับการสนับสนุนโดยห้องสมุดบางพิเศษเพียงเช่นลินุกซ์ได้อย่างรวดเร็วสตรีมมิ่งจาก OpenSS7หรือการเลียนแบบเช่นIBCs ไม่มีวิธีง่ายๆในการสร้าง / dev / tcp บน Linux คุณอาจพบ / dev / tcp ที่ใช้จาก bash แต่ในกรณีนี้มันเป็นเพียง relict ซึ่งบอกให้ bash เปิดซ็อกเก็ต tcp อุปกรณ์ไม่มีอยู่จริง
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet ดำเนินการทดสอบไฟล์ไบนารีมีวิธีสร้างไฟล์อักขระ tcp ภายใต้ / dev โดยใช้คำสั่ง mknod tcp c <x> <y> ในยูนิกซ์รายการอุปกรณ์สำหรับ tcp คือ 42,2 นั่นคือคำสั่ง file (file / dev / tcp) แสดง "character special (42/2)" โดยที่ x = 42 และ y = 2 แต่มีรายการเดียวกันฉันสร้างขึ้นใน Linux เป็น mknod tcp c 42 2.again socket_id คือ -1 นี่คือปัญหาคือรายการอุปกรณ์ที่จะใช้ Linux
missingsemicolon

1
@smilebhuff มันไม่เพียงพอที่จะสร้างโหนดใครบางคนในเคอร์เนลต้องรับผิดชอบมัน - ซึ่งไม่ใช่กรณีภายใต้ Linux
glglgl

คำตอบ:


18

t_open()และที่เกี่ยวข้อง/dev/tcpและเป็นส่วนหนึ่งของอินเทอร์เฟซ TLI / XTIซึ่งสูญเสียการต่อสู้สำหรับ TCP / IP APIs ไปยังซ็อกเก็ต BSD

บน Linux นั้นมีอยู่/dev/tcpหลายประเภท มันไม่ใช่ไฟล์จริงหรืออุปกรณ์เคอร์เนล เป็นสิ่งที่Bash จัดทำขึ้นเป็นพิเศษและมีอยู่สำหรับการเปลี่ยนเส้นทางเท่านั้น ซึ่งหมายความว่าแม้ว่าจะมีการสร้าง/dev/tcpสิ่งอำนวยความสะดวกในเคอร์เนลก็จะถูกหลอกลวงในการใช้โต้ตอบแบบโต้ตอบ 99% [*] ของเวลา

ทางออกที่ดีที่สุดคือการเปลี่ยนไปใช้ซ็อกเก็ต BSD ขอโทษ

คุณอาจสามารถทำให้เลเยอร์การจำลองstrxnet XTI ทำงานได้ แต่คุณควรเอาเวลาไปลง XTI ดีกว่า มันเป็น API ที่ตายแล้วไม่ได้รับการสนับสนุนไม่เพียง แต่บน Linux แต่ยังอยู่ใน BSD รวมถึง OS X

(โดยวิธีการที่ห้องสมุด strxnet จะไม่ได้สร้างบนBSDเพราะมันขึ้นอยู่กับLiSซึ่งเป็นองค์ประกอบของเคอร์เนลลินุกซ์มันจะไม่ได้configureอยู่ในระบบ BSD หรือ OS X หุ้นเพราะมันขึ้นอยู่กับ GNU sed.)

[*] ฉันใช้การคาดเดาที่ดุเดือดกับข้อเท็จจริงที่ว่า Bash เป็นเชลล์เริ่มต้นสำหรับผู้ใช้ที่ไม่ใช่รูทในดิสทริบิวชัน distros Linux ทั้งหมดที่ฉันใช้ ดังนั้นคุณต้องออกไปให้ไกลบน Linux เพื่อให้ได้สิ่งอื่นที่ไม่ใช่ Bash


วอร์เรนขอบคุณสำหรับอินพุตของคุณ ขออภัยฉันยังใหม่กับแนวคิดการเขียนโปรแกรมซ็อกเก็ตและ API เหล่านี้ ได้โปรดเปลือยคำถามของฉันด้วย คุณหมายถึงอะไรโดย "strxnet XTI emulation latyer" เราเพิ่งติดตั้งหนึ่งในแพ็กเกจของ strxnet (strxnet-0.9.2.10.tar) เพื่อรับไลบรารี / headerfiles ของ openss7 ฉันจะทำอะไรได้มากกว่านี้
missingsemicolon

ฉันไม่เคยใช้มันมาก่อน แต่จากการตรวจสอบอย่างรวดเร็วของ tarball ดูเหมือนว่าเมื่อมันถูกติดตั้งแล้วมันจะมีเลเยอร์การจำลอง XTI คุณควรจะสามารถรวบรวมคอมไพเลอร์ของคุณด้วย-Iและตั้ง-Lค่าสถานะและคาดหวังให้มันทำงานได้ แต่ถ้าไม่ฉันจะไม่ทิ้งเวลาไว้เยอะ
Warren Young

ฉันรู้เกี่ยวกับ -I และ -L ซึ่งรวมส่วนหัว / ไลบรารีตามลำดับ แต่ฉันต้องทำอะไรที่นี่กับ -I / -L? ขออภัยอีกครั้งหากคำถามของฉันผิด
missingsemicolon

1
ขึ้นอยู่กับว่าแพ็กเกจติดตั้งไฟล์ไว้ที่ไหน ค้นหาไฟล์ห้องสมุดlibstrxnet.so.*: -Lว่าไดเรกทอรีคือสิ่งที่คุณส่งผ่านไปยัง ค้นหาxti.h: -Iผ่านไดเรกทอรีที่จะ คุณจะต้องมี-lstrxnetอย่างน้อย บรรทัดล่างสุด: ดูเอกสาร strxnet
Warren Young

วอร์เรนนั่นคือสิ่งที่ฉันทำในระหว่างการรวบรวม โปรดดูขั้นตอนที่ฉันให้ไว้ในคำสั่งก่อนหน้า ไลบรารีนี้มีฟังก์ชัน t_open () แต่ปัญหาไม่ได้อยู่กับฟังก์ชั่นนี้ ปัญหาเกิดขึ้นกับ / dev / tcp ซึ่ง t_open พยายามเปิด
missingsemicolon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.