【问题标题】:homebrew socat on OS X Mountain Lion, sctp "Protocol not supported"OS X Mountain Lion 上的自制 socat,sctp“不支持协议”
【发布时间】:2013-03-14 10:04:12
【问题描述】:

我正在努力开发一个涉及SCTP协议的爱好程序,为了掌握基础知识,我尝试使用homebrew安装socat,socat是一个类似netcat的工具,用于测试各种协议。但到目前为止,在 OS X Mountain Lion 上没有任何成功。这是安装和错误日志:

$ 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

它失败了。在socat 主页上,它声明了对 OS X 的支持,但显然 sctp 可能不支持。可能是使用 sctp 的人太少了,我用谷歌搜索了这个错误到处都找不到有用的东西。

我在 Gentoo/Debian 服务器上尝试了同样的事情,它们都运行良好,但我无法让它在 OS X 下运行。我对 OS X 世界还很陌生,请问有什么建议吗?

【问题讨论】:

    标签: macos osx-mountain-lion homebrew sctp socat


    【解决方案1】:

    看起来 OS X 头文件知道 SCTP 协议,但库实际上并没有实现它。您可以使用第三方扩展来破解它。

    我在 OS X 10.8.3 上得到了同样的结果。安装 socat 时,它会在 configure 中检测 SCTP 支持并设置 WITH_SCTP 定义。

    $ ./配置 | grep -i sctp 配置:警告:未找到包含文件 netpacket/packet.h,禁用接口 检查是否包括 SCTP 支持...是 检查 IPPROTO_SCTP... 是

    但是,如果您查看configure,这是一个非常简单的测试。 “是否包括 SCTP 支持”是是否指定了 --enable-sctp,默认情况下是打开的。而“检查 IPPROTO_SCTP”只定义了该协议常量是否在头文件中定义。也就是说,标头可以知道该协议并具有表示它的值,但底层系统可能不会实际使用。我认为情况就是这样:OS X 内核不提供 SCTP 实现。

    在较新版本的 OS X 下,“初步”第三方支持 SCTP:https://nplab.fh-muenster.de/groups/wiki/wiki/f366c/。安装这个让 SCTP 在 homebrew 的 socat 中为我工作。

    [@在~] $ socat -d -d sctp-listen:99999 - 2013/04/24 22:19:38 socat[270] E socket(2, 1, 132): 不支持协议 2013/04/24 22:19:38 socat[270] N 出口(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:51 socat[291] 我开始接受循环 2013/04/24 22:20:51 socat[291] N 监听 LEN=16 AF=2 0.0.0.0:34463

    注意:这是一个第三方内核扩展,它是“初步的”,没有很多文档,我不能保证来源。这很可能很脆弱,而且可能很难从错误中恢复过来。我会在虚拟机中执行此操作,而在您的主机中。虚拟机非常适合尝试低级别的东西和各种机器配置。 (举个例子:为了弄清楚这个问题,我在我的机器上做了一堆乱七八糟的事情,并以 root 身份做了一些有问题的事情,然后,我将我的虚拟机恢复为快照,就好像它从未发生过一样。)

    另一个选项是查看 libusrsctp 中的“用户空间”(非内核)SCTP 支持,可在 Homebrew 中使用。这不会让socat 与 SCTP 一起工作,但可能会支持您使用它进行其他爱好编程。

    【讨论】:

    • 啊,所以 OS X 默认不支持 sctp,谢谢!
    猜你喜欢
    • 2013-04-10
    • 2012-08-02
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2012-10-21
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多