Linux에 / dev / tcp가 없습니다


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의 값은 > 0Linux에 있습니다 -1. 이유는 UNIX에 있으며가 있습니다 /dev/tcp. 이것은 Linux에는 없습니다. 또한 UNIX에서이 tcp파일은 일반 파일과 다른 문자 특수 파일입니다.

Linux에서 UNIX에서와 동일한 문자 특수 파일을 작성하는 방법이 있습니까?


5
Berkeley 소켓 / POSIX 소켓을 사용하지 않는 이유가 있습니까?
jofel

네 조펠. 이 경우 실행 불가능한 대량의 기존 코드를 수정해야합니다. Linux에서 / dev / tcp를 대체하거나 Linux에서 Unix처럼 작동하도록 Linux에서 어떻게 작성 해야하는지 찾고 있습니다. 다음은 Unix의 / dev / tcp에 대한 정보입니다.
missingsemicolon

1
소프트웨어를 어떻게 컴파일합니까? Linux의 AFAIK 인 XTI / TLI는 OpenSS7의 Linux Fast Stream 또는 iBCS 와 같은 에뮬레이터와 같은 일부 추가 라이브러리에서만 지원됩니다 . Linux에서는 / dev / tcp를 간단하게 만들 수있는 방법이 없습니다. bash에서 / dev / tcp를 사용했을 수도 있지만이 경우에는 bash가 tcp 소켓을 열도록 지시하는 유물 일뿐입니다. 장치가 실제로 존재하지 않습니다.
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet 이진 파일 테스트 실행 mknod tcp c <x> <y> 명령을 사용하여 / dev 아래에 문자 파일 tcp를 작성하는 방법이 있습니다. 유닉스에서 tcp의 장치 항목은 42,2입니다. 즉, 파일 명령 (파일 / dev / tcp)은 x = 42이고 y = 2 인 "특수 문자 (42/2)"를 표시합니다. 그러나 Linux에서 mknod tcp c 42 2와 동일한 항목을 만들면 socket_id는 -1입니다. 여기서 문제는 Linux에서 사용되는 장치 항목입니다.
missingsemicolon

1
@smilebhuff 노드를 만드는 것만으로는 충분하지 않습니다. 커널의 누군가가 책임을 져야합니다. Linux에서는 그렇지 않습니다.
glglgl

답변:


18

t_open()그와 관련된 기능 /dev/tcpTLI / XTI 인터페이스 의 일부이며, TCP / IP API와 BSD 소켓의 싸움을 잃었습니다.

리눅스에는 /dev/tcp여러 가지가 있습니다. 실제 파일이나 커널 장치가 아닙니다. 그것은 뭔가 특별 배쉬에서 제공 하고, 그것은 단지 재 지정을 위해 존재한다. 즉 /dev/tcp, 커널 내부 기능 을 만들더라도 쉘에서 99 % [*]의 대화식 사용으로 마스킹 될 수 있습니다.

가장 좋은 해결책은 실제로 BSD 소켓으로 전환하는 것입니다. 죄송합니다.

당신은 얻을 수있을 strxnet 작업에 XTI 에뮬레이션 레이어,하지만 당신은 더 나은 XTI 하차로 시간을두고 떨어져있어. Linux뿐만 아니라 OS X를 포함한 BSD에서도 지원되지 않는 죽은 API입니다.

(그런데 strxnet 라이브러리는 리눅스 커널의 구성 요소 인 LiS에 의존하기 때문에 BSD에서도 빌드되지 않을 것 입니다. configureBSD 나 OS X 시스템에도 의존하지 않기 때문입니다. GNU sed.)

[*]이 모든 추측은 Bash가 내가 사용한 모든 Linux 배포판에서 루트가 아닌 사용자를위한 기본 쉘이라는 사실에 근거하고있다. 따라서 원칙적으로 Bash 이외의 것을 얻으려면 Linux에서 나가야합니다.


귀하의 의견에 감사드립니다. 죄송합니다.이 소켓 프로그래밍 및 API 개념이 처음입니다. 내 질문에 맨손으로 부탁드립니다. "strxnet XTI emulation latyer"는 최근에 opens7 라이브러리 / 헤더 파일 중 일부를 얻기 위해 strxnet (strxnet-0.9.2.10.tar) 패키지 중 하나를 설치했습니다.
missingsemicolon

나는 그것을 직접 사용해 본 적이 없지만 tarball의 빠른 검사에서 일단 설치되면 XTI 에뮬레이션 레이어를 제공합니다. 컴파일러에서 -I-L플래그를 지정하고 작동 할 것으로 기대할 수 있어야합니다. 그러나 그렇지 않으면 많은 시간을 허비하지 않을 것입니다.
워렌 영

헤더 / 라이브러리를 각각 포함하는 -I 및 -L에 대해 알고 있습니다. 그러나 여기서 정확히 -I / -L로 무엇을해야합니까? 내 질문이 틀리면 다시 죄송합니다.
missingsemicolon

1
패키지가 파일을 설치 한 위치에 따라 다릅니다. 라이브러리 파일을 찾으십시오 libstrxnet.so.*. 해당 디렉토리가 전달한 것 -L입니다. 찾기 xti.h: 해당 디렉토리를로 전달하십시오 -I. 또한 -lstrxnet최소한 필요합니다 . 결론 : strxnet 문서를 참조하십시오.
워렌 영

워렌, 그게 내가 편집하는 동안 한 일이다. 이전 명령에서 수행 한 단계를 참조하십시오. 이 라이브러리에는 t_open () 함수가 있습니다. 그러나이 기능에는 문제가 없습니다. t_open이 열려고하는 / dev / tcp에 문제가 있습니다.
missingsemicolon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.