Вопрос

I am working very hard on a hobby program which involves the SCTP protocol, to grasp the basics, I tried to install socat using homebrew, socat is a netcat-like tool for testing various protocoles. But without any success on OS X Mountain Lion so far. Here is the install & error log:

$ 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

You see, the homebrew finished compiling and installed socat successfully. To verify that SCTP is enabled

$ 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*/

To try a simple SCTP connection

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

And it failed. On socat homepage it declares OS X support, but apparently sctp migh not. Perhaps it's just too few people use sctp, and I Googled this error everywhere and couldn't find anything useful yet.

I tried the same thing on Gentoo/Debian server and they both worked fine, I just can not make it work under OS X. I am fairly new to OS X world, any tips please?

Это было полезно?

Решение

Looks like the OS X header files are aware of the SCTP protocol, but the libraries don't actually implement it. You can hack it in with third-party extensions.

I get the same thing results on OS X 10.8.3. When installing socat, it detects SCTP support in configure and sets that WITH_SCTP definition.

$ ./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

However, if you look in configure, it's a really simple test. The "whether to include SCTP support" is whether --enable-sctp was specified, and is on by default. And the "checking for IPPROTO_SCTP" just defines whether that protocol constant is defined in the header files. That is, the headers could be aware of that protocol and have a value to represent it, but the underlying system might not implement actually using. I think that's the case here: the OS X kernel doesn't provide an SCTP implementation.

There's "preliminary" third party support for SCTP under newer versions of OS X: https://nplab.fh-muenster.de/groups/wiki/wiki/f366c/. Installing this got SCTP working for me in homebrew's 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

Caution: this is a third-party kernel extension, it's "preliminary", there's not a whole lot of documentation, and I can't vouch for the source. This is likely to be fragile, and it may be hard to recover from mistakes. I would do this in a virtual machine, and not in your main machine. VMs are great for experimenting with low level stuff and various machine configurations. (Case in point: to figure out this question I did a bunch of messing around with my machine and some questionable things as root, and afterwards, I reverted my VM to a snapshot and it's like it never happened.)

Another option is looking at the "userland" (non-kernel) SCTP support in libusrsctp, available in Homebrew. This won't get socat working with SCTP, but may support your other hobby programming with it.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top