2013-03-25 58 views
4

我正在非常努力地参与一个涉及SCTP协议的爱好程序,掌握基础知识,我试图使用homebrew来安装socat,socat是一个netcat-像测试各种protocoles的工具。但是迄今为止,OS X Mountain Lion没有取得任何成功。下面是安装&错误日志:OS X Mountain Lion,sctp上的homebrew socat“协议不支持”

$ 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世界相当陌生,请提供任何提示?

回答

1

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

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

 
$ ./configure | grep -i sctp 
configure: WARNING: include file netpacket/packet.h not found, disabling interface 
checking whether to include SCTP support... yes 
checking for IPPROTO_SCTP... yes 

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

在较新版本的OS X下有对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 socket(2, 1, 132): Protocol not supported 
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 - 
[...snip...] 
2013/04/24 22:20:51 socat[291] I socket(2, 1, 132) -> 3 
2013/04/24 22:20:51 socat[291] I starting accept loop 
2013/04/24 22:20:51 socat[291] N listening on LEN=16 AF=2 0.0.0.0:34463 

注意:这是一个第三方内核扩展,这是“初步”,有没有一大堆的文件,我不能保证源。这可能是脆弱的,并且可能很难从错误中恢复过来。我会在虚拟机中执行此操作,并在您的主机中执行而不是。虚拟机非常适合用于实验低级别的东西和各种机器配置。 (例如:为了弄清楚这个问题,我做了一堆关于我的机器和一些可疑事情的根,然后我将虚拟机恢复为快照,就像它从未发生过一样。)

另一个选项是在Homebrew中查看libusrsctp中的“userland”(非内核)SCTP支持。这不会得到socat与SCTP一起工作,但可能支持您的其他业余爱好编程。

+0

ahhh,所以OS X默认不支持sctp内建,谢谢! – est 2013-04-25 03:05:37

相关问题