4

私はSCTPプロトコルを含む趣味のプログラムに非常に熱心に取り組んでいます。基本を理解するために、自作を使用してsocatをインストールしようとしました。socatはさまざまなプロトコルをテストするためのnetcatのようなツールです。しかし、これまでのところOS XMountainLionでは成功していません。インストールとエラーのログは次のとおりです。

$ brew install socat
==> Installing socat dependency: readline
==> Downloading http://ftpmirror.gnu.org/readline/readline-6.2.tar.gz
######################################################################## 100.0%
tar: Failed to set default locale
==> Patching
patching file callback.c
patching file input.c
patching file patchlevel
patching file support/shobj-conf
patching file vi_mode.c
==> ./configure --prefix=/usr/local/Cellar/readline/6.2.4 --mandir=/usr/local/Ce
==> make install
==> Caveats
This formula is keg-only: so it was not symlinked into /usr/local.

OS X provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include

==> Summary
??  /usr/local/Cellar/readline/6.2.4: 31 files, 1.6M, built in 34 seconds
==> Installing socat
==> Downloading http://www.dest-unreach.org/socat/download/socat-1.7.2.1.tar.bz2
######################################################################## 100.0%
tar: Failed to set default locale
==> Downloading patches
######################################################################## 100.0%
==> Patching
patching file xioexit.c
==> ./configure --prefix=/usr/local/Cellar/socat/1.7.2.1 --mandir=/usr/local/Cel
==> make install
  /usr/local/Cellar/socat/1.7.2.1: 8 files, 624K, built in 41 seconds

ご覧のhomebrewとおり、コンパイルが完了し、socat正常にインストールされました。SCTPが有効になっていることを確認するには

$ socat -V
socat by Gerhard Rieger - see www.dest-unreach.org
socat version 1.7.2.1 on Mar 25 2013 08:43:00
   running on Darwin version Darwin Kernel Version 12.2.1: Thu Oct 18 12:13:47 PDT 2012; root:xnu-2050.20.9~1/RELEASE_X86_64, release 12.2.1, machine x86_64
features:
  #define WITH_STDIO 1
  #define WITH_FDNUM 1
  #define WITH_FILE 1
  #define WITH_CREAT 1
  #define WITH_GOPEN 1
  #define WITH_TERMIOS 1
  #define WITH_PIPE 1
  #define WITH_UNIX 1
  #undef WITH_ABSTRACT_UNIXSOCKET
  #define WITH_IP4 1
  #define WITH_IP6 1
  #define WITH_RAWIP 1
  #define WITH_GENERICSOCKET 1
  #undef WITH_INTERFACE
  #define WITH_TCP 1
  #define WITH_UDP 1
  #define WITH_SCTP 1
  #define WITH_LISTEN 1
  #define WITH_SOCKS4 1
  #define WITH_SOCKS4A 1
  #define WITH_PROXY 1
  #define WITH_SYSTEM 1
  #define WITH_EXEC 1
  #define WITH_READLINE 1
  #undef WITH_TUN
  #define WITH_PTY 1
  #define WITH_OPENSSL 1
  #undef WITH_FIPS
  #undef WITH_LIBWRAP
  #define WITH_SYCLS 1
  #define WITH_FILAN 1
  #define WITH_RETRY 1
  #define WITH_MSGLEVEL 0 /*debug*/

単純なSCTP接続を試すには

$ socat -  sctp4:my_server:19191
2013/03/25 08:45:46 socat[18838] E socket(2, 1, 132): Protocol not supported

そしてそれは失敗しました。ホームページではOSXsocatのサポートを宣言していますが、sctpはそうではないようです。おそらく、sctpを使用している人が少なすぎるので、私はこのエラーをどこでもグーグルで検索しましたが、まだ有用なものを見つけることができませんでした。

Gentoo / Debianサーバーで同じことを試しましたが、どちらも正常に機能しました。OSXでは機能しません。OSXの世界はかなり新しいので、ヒントを教えてください。

4

1 に答える 1

1

OS XヘッダーファイルはSCTPプロトコルを認識しているように見えますが、ライブラリは実際にはそれを実装していません。サードパーティの拡張機能を使ってハッキングすることができます。

OSX10.8.3でも同じ結果が得られます。socatをインストールすると、configureでSCTPサポートが検出され、そのWITH_SCTP定義が設定されます。

$ ./configure | grep -i sctp
configure:警告:インクルードファイルnetpacket / packet.hが見つかりません、インターフェースを無効にします
SCTPサポートを含めるかどうかを確認しています...はい
IPPROTO_SCTPをチェックしています...はい

ただし、を見るとconfigure、これは非常に簡単なテストです。「SCTPサポートを含めるかどうか」は、-enable-sctpが指定されているかどうかであり、デフォルトでオンになっています。また、「IPPROTO_SCTPのチェック」は、そのプロトコル定数がヘッダーファイルで定義されているかどうかを定義するだけです。つまり、ヘッダーはそのプロトコルを認識し、それを表す値を持つことができますが、基盤となるシステムは実際にを使用して実装しない場合があります。ここではそうだと思います。OSXカーネルはSCTP実装を提供していません。

新しいバージョンのOSXでは、SCTPの「予備的な」サードパーティサポートがあります:https ://nplab.fh-muenster.de/groups/wiki/wiki/f366c/ 。これをインストールすると、自作でSCTPが機能するようになりましたsocat

[@ in〜]
$ socat -d -d sctp-listen:99999-
2013/04/24 22:19:38 socat [270] Eソケット(2、1、132):プロトコルはサポートされていません
2013/04/24 22:19:38 socat [270] N exit(1)
[✘@in〜]
$ sudo kextload /System/Library/Extensions/SCTP.kext
[✘@in〜]
$ socat -d -d -d sctp-listen:99999-
[...をちょきちょきと切る...]
2013/04/24 22:20:51 socat [291] I socket(2、1、132)-> 3
2013/04/24 22:20:51socat[291]受け入れループを開始します
2013/04/24 22:20:51 socat[291]LENで聞いているN=16 AF = 2 0.0.0.0:34463

注意:これはサードパーティのカーネル拡張機能であり、「暫定版」であり、ドキュメントはそれほど多くなく、ソースを保証することはできません。これは壊れやすい可能性があり、間違いから回復するのは難しいかもしれません。これは、メインマシンではなく、仮想マシンで行います。VMは、低レベルのものやさまざまなマシン構成を試すのに最適です。(例:この質問を理解するために、私は自分のマシンといくつかの疑わしいことをルートとしていじり回しました。その後、VMをスナップショットに戻しましたが、それは決して起こらなかったようです。)

libusrsctpもう1つのオプションは、Homebrewで利用可能な「userland」(非カーネル)SCTPサポートを調べることです。socatこれはSCTPでは機能しませんが、他の趣味のプログラミングをサポートする可能性があります。

于 2013-04-25T02:26:23.510 に答える