/ 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の値は> 0Linuxではです-1。理由はUNIXにあり/dev/tcpます。これはLinuxにはありません。またUNIXではこのtcpファイルは通常のファイルとは異なるキャラクタースペシャルファイルです。

LinuxでUNIXと同じキャラクタースペシャルファイルを作成する方法はありますか?


5
バークレーソケット/ POSIXソケットを使用しない理由はありますか?
jofel

はい、ジョフェル。その場合、実現不可能な大量の既存のコードを変更する必要があります。Linuxでの/ dev / tcpの置き換え、またはUnixで動作するようにLinuxでそれを作成する方法を探しています。以下は、UNIXの/ dev / tcpに関する情報です。
missingsemicolon、

1
ソフトウェアをどのようにコンパイルしますか?Linux上で私の知る限りは、XTI / TLIだけのようないくつかの余分なライブラリでサポートされてOpenSS7からLinuxの高速ストリーミングなどエミュレータのiBCS。Linuxで単に/ dev / tcpを作成する方法はありません。/ ash / tcpがbashから使用されている場合がありますが、この場合、tashソケットを開くようにbashに指示するのは単なる遺物です。デバイスは実際には存在しません。
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet実行バイナリファイルテストコマンドmknod tcp c <x> <y>を使用して、/ devの下に文字ファイルtcpを作成する方法があります。UNIXでは、tcpのデバイスエントリは42,2です。つまり、ファイルコマンド(file / dev / tcp)は、「特殊文字(42/2)」を表示します(x = 42およびy = 2)。しかし、mknod tcp c 42 2.Linuxで作成したのと同じエントリを使用して、ここでもsocket_idは-1です。ここでの問題は、Linuxで使用するデバイスエントリです。
missingsemicolon

1
@smilebhuffノードを作成するだけでは不十分です。カーネル内の誰かがノードの責任を負う必要があります。これは、Linuxでは当てはまりません。
glglgl 2012年

回答:


18

t_open()それに関連するもの/dev/tcpなどはTLI / XTIインターフェースの一部であり、BSDソケットに対するTCP / IP APIの戦いに負けました。

Linuxに/dev/tcpは一種の種類があります。実際のファイルやカーネルデバイスではありません。これはBashによって特別に提供されるものであり、リダイレクトのためにのみ存在します。これは、カーネル/dev/tcp内機能を作成したとしても、対話的な使用ではシェルによって99%[*]の時間でマスクされることを意味します。

最善の解決策は、実際にはBSDソケットに切り替えることです。ごめんなさい。

strxnet XTIエミュレーションレイヤーを機能させることはできるかもしれませんが、XTIをオフにすることに時間をかける方がよいでしょう。Linuxだけでなく、OS Xを含むBSDでもサポートされていないデッドAPIです。

(ちなみに、strxnetライブラリは、LinuxカーネルのコンポーネントであるLiSに依存しているため、BSDで構築することすらできません。標準のconfigureBSDまたはOS Xシステムでさえ依存していません。GNU sed)

[*]このワイルドな推測は、私が使用したすべてのLinuxディストリビューションで、Bashが非rootユーザーのデフォルトのシェルであるという事実に基づいています。したがって、Bash以外のものを入手するには、原則として、Linuxの邪魔にならないようにする必要があります。


ウォーレン、ご意見ありがとうございます。申し訳ありませんが、これらのソケットプログラミングとAPIの概念は初めてです。私の質問に素直に答えてください。「strxnet XTIエミュレーションレイヤー」とは、openss7ライブラリ/ヘッダーファイルを取得するために、最近strxnet(strxnet-0.9.2.10.tar)のパッケージの1つをインストールしたことを意味します。
missingsemicolon

私自身はこれを使用したことがありませんが、tarballをざっと調べたところ、インストールするとXTIエミュレーションレイヤーを提供するように見えました。あなただけでそれであなたのコンパイラを指し示すことができるはず-I-Lフラグと仕事にそれを期待しています。しかし、そうでなければ、私はそれに多くの時間をかけません。
ウォーレンヤング

ヘッダー/ライブラリをそれぞれ含める-Iと-Lについて知っています。しかし、ここで-I / -Lを使用して正確に何をする必要がありますか?私の質問が間違っていたらまた申し訳ありません。
ミッシングセミコロン

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.