Giter Site home page Giter Site logo

zmq4's Introduction

A Go interface to ZeroMQ version 4.


Warning

Starting with Go 1.14, on Unix-like systems, you will get a lot of interrupted signal calls. See the top of a package documentation for a fix.


Go Report Card GoDoc

This requires ZeroMQ version 4.0.1 or above. To use CURVE security in versions prior to 4.2, ZeroMQ must be installed with libsodium enabled.

Partial support for ZeroMQ 4.2 DRAFT is available in the alternate version of zmq4 draft. The API pertaining to this is subject to change. To use this:

import (
    zmq "github.com/pebbe/zmq4/draft"
)

For ZeroMQ version 3, see: http://github.com/pebbe/zmq3

For ZeroMQ version 2, see: http://github.com/pebbe/zmq2

Including all examples of ØMQ - The Guide.

Keywords: zmq, zeromq, 0mq, networks, distributed computing, message passing, fanout, pubsub, pipeline, request-reply

See also

  • go-zeromq/zmq4 — A pure-Go implementation of ØMQ (ZeroMQ), version 4
  • go-nanomsg — Language bindings for nanomsg in Go
  • goczmq — A Go interface to CZMQ
  • Mangos — An implementation in pure Go of the SP ("Scalable Protocols") protocols

Requirements

zmq4 is just a wrapper for the ZeroMQ library. It doesn't include the library itself. So you need to have ZeroMQ installed, including its development files. On Linux and Darwin you can check this with ($ is the command prompt):

$ pkg-config --modversion libzmq
4.3.1

The Go compiler must be able to compile C code. You can check this with:

$ go env CGO_ENABLED
1

You can't do cross-compilation. That would disable C.

Windows

Build with CGO_CFLAGS and CGO_LDFLAGS environment variables, for example:

$env:CGO_CFLAGS='-ID:/dev/vcpkg/installed/x64-windows/include'
$env:CGO_LDFLAGS='-LD:/dev/vcpkg/installed/x64-windows/lib -l:libzmq-mt-4_3_4.lib'

Deploy result program with libzmq-mt-4_3_4.dll

Install

go get github.com/pebbe/zmq4

Docs

API change

There has been an API change in commit 0bc5ab465849847b0556295d9a2023295c4d169e of 2014-06-27, 10:17:55 UTC in the functions AuthAllow and AuthDeny.

Old:

func AuthAllow(addresses ...string)
func AuthDeny(addresses ...string)

New:

func AuthAllow(domain string, addresses ...string)
func AuthDeny(domain string, addresses ...string)

If domain can be parsed as an IP address, it will be interpreted as such, and it and all remaining addresses are added to all domains.

So this should still work as before:

zmq.AuthAllow("127.0.0.1", "123.123.123.123")

But this won't compile:

a := []string{"127.0.0.1", "123.123.123.123"}
zmq.AuthAllow(a...)

And needs to be rewritten as:

a := []string{"127.0.0.1", "123.123.123.123"}
zmq.AuthAllow("*", a...)

Furthermore, an address can now be a single IP address, as well as an IP address and mask in CIDR notation, e.g. "123.123.123.0/24".

zmq4's People

Contributors

abligh avatar alvarolm avatar chrbsg avatar clintlombard avatar conormurray95 avatar cornelk avatar jollyjoker992 avatar larsmans avatar lefinal avatar pebbe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zmq4's Issues

mdbroker example does not always purge disconnected workers

The comment at the Purge method states that it deletes idle workers that haven't pinged the broker. But lets say two workers connect to the broker and none of them gets any work.
W 1: connects, and is appended to the broker's waiting list and service's waiting list
W 2: connects, and is appended to the broker's waiting list and service's waiting list

When W 2 disconnects it will not be purged because the Purge method stops as soon as it finds a worker that is not expired. If W 1 send its heartbeats on time the Purge method will never reach W 2.

Then if a client sends a request to be processed by a service as W 2 and W 2 is the only one who is listed, but disconnected, the request is sent to W 2 and no error returns.

Receiving multi-part messages

How do you receive multi-part messages with this library?

I see documentation on sending multi part, using SendMessage but not the other direction. Am I missing something or does that feature not exist?

Missing License

I can't find how your code is licensed and under which conditions I/my company am/is allowed to use it.

Error binding zmq4 for windows 8.1

C:\>go get github.com/pebbe/zmq4
# github.com/pebbe/zmq4
C:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v4-rev2/mingw64/bin/../lib/
gcc/x86_64-w64-mingw32/4.9.2/../../../../lib/zmq.lib: error adding symbols: File in wrong format
collect2.exe: error: ld returned 1 exit status

ZMQ4.0.4 LIB
libzmq-v110-mt-4_0_4.lib OR libzmq-v120-mt-4_0_4.lib
Compilation failed

Error getting zmq4 Go Binding

Hello,

I'm trying to get zmq4 for use with Go (on windows environment) but i'm getting some errors while getting it with command go get "github.com/pebbe/zmq4". Can anyone provide some kind of information about this? And any tips about install zmq4 go binding on windows ?

error1

go 1.4 cannot work with gozmq4

Hi pebbe,

When I use go 1.3 to compile below code. it works fine. But if I use go 1.4 , it will report below error. when the program run .

var ctx *zmq4.Context
var zmq_socket *zmq4.Socket

func init() {
    zmq_init()
}

func zmq_init() {
    fmt.Println("111111111")
    var err error

    ctx, err = zmq4.NewContext()
    if err != nil {
        fmt.Println("NewContext error!")
        panic("new contect error!")
    }

    zmq_socket, err = ctx.NewSocket(zmq4.PUB)
    if err != nil {
        fmt.Println("NewSocket error!")
        return
    }
    if zmq_socket.Bind("tcp://127.0.0.1:5557") != nil {
        fmt.Println("Bind error!")
        return
    }
}

Exception 0xc0000096 0x0 0x0 0x905126
PC=0x905126
signal arrived during cgo execution

github.com/pebbe/zmq4._C2func_zmq_ctx_new(0x0, 0x0, 0x0)
        d:/gopath/src/github.com/pebbe/zmq4/:173 +0x57
github.com/pebbe/zmq4.init·1()
        d:/gopath/src/github.com/pebbe/zmq4/zmq4.go:91 +0x6c
github.com/pebbe/zmq4.init()
        d:/gopath/src/github.com/pebbe/zmq4/zmq4.go:1072 +0x2b9
main.init()
        D:/b/source/deploy/src/agent2/main.go:1173 +0x76

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
        c:/go/src/runtime/asm_386.s:2287 +0x1
eax     0x53756aa5
ebx     0x127f3f00
ecx     0x92a5c0
edx     0x127f3ec0
edi     0x140
esi     0x920be0
ebp     0x920fe0
esp     0x18feac
eip     0x905126
eflags  0x10203
cs      0x23
fs      0x53
gs      0x2b

static zmqlib

following the golang philosophy the compiled binary shouldn't have any dependencies, I believe '-static' has to be added to LDFLAGS.

Crash on RecvBytes

Hi,

I'm seeing crashes on RecvBytes (but sometimes on SendBytes as well) on REQ socket, when other endpoint dies (ROUTER -> DEALER -> REP sock chain on the other end). Always reproducible. I'm checking errors on each call, but doesn't help here.

Assertion failed: ok (mailbox.cpp:82)
SIGABRT: abort
PC=0x7f6949eced27
signal arrived during cgo execution
goroutine 221 [syscall, locked to thread]:
runtime.cgocall_errno(0x402d20, 0xc208064cc0, 0x0)
/home/scyth/godev/root/src/runtime/cgocall.go:130 +0xf5 fp=0xc208064c80 sp=0xc208064c58
github.com/pebbe/zmq4._C2func_zmq_msg_recv(0xc208064d00, 0x7f6904001000, 0x0, 0x0, 0x0, 0x0)
/home/scyth/godev/remote/src/github.com/pebbe/zmq4/:211 +0x55 fp=0xc208064cc0 sp=0xc208064c80
github.com/pebbe/zmq4.(*Socket).RecvBytes(0xc2081e4330, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/scyth/godev/remote/src/github.com/pebbe/zmq4/zmq4.go:605 +0x232 fp=0xc208064dc8 sp=0xc208064cc0

Sometimes, I also get:
Resource temporarily unavailable (signaler.cpp:285)
Aborted (core dumped)

Any idea?

context.Term() hangs or crashes randomly

Hi again Peter,

what about this one?

context.Term() hangs or crashes randomly.

package crashTest

import (
    "testing"
    zmq "github.com/pebbe/zmq4"
    "fmt"
)

func TestCrash(t *testing.T) {
    for i:=0; i<10000; i++ {
        fmt.Println(i)

        context, err := zmq.NewContext()
        if err != nil { t.Fatal(err) }

        socket, err := context.NewSocket(zmq.ROUTER)
        if err != nil { t.Fatal(err) }

        // Retry opening a socket until it becomes free
        for {
            err = socket.Bind("tcp://127.0.0.1:5555")
            if err == nil {
                break
            }
        }

        poller := zmq.NewPoller()
        poller.Add(socket, zmq.POLLIN)

        err = socket.SetLinger(0)
        if err != nil { t.Fatal(err) }

        err = socket.Close()
        if err != nil { t.Fatal(err) }

        err = context.Term()
        if err != nil { t.Fatal(err) }
    }
}

Example hang:

$ go test
0
1
2
[...]
876

Example crash:

$ go test
0
1
2
[...]
1264
Assertion failed: ok (mailbox.cpp:82)
SIGABRT: abort
PC=0x7fab49cbef79
signal arrived during cgo execution

goroutine 20 [syscall]:
runtime.cgocall(0x4028f0, 0x7fab4a51ae80)
        /usr/local/go/src/pkg/runtime/cgocall.c:143 +0xe5 fp=0x7fab4a51ae58 sp=0x7fab4a51ae10
github.com/pebbe/zmq4._C2func_zmq_ctx_term(0x7fab300008c0, 0x0, 0x0, 0x0)
        github.com/pebbe/zmq4/_obj/_cgo_defun.c:198 +0x31 fp=0x7fab4a51ae80 sp=0x7fab4a51ae58
github.com/pebbe/zmq4.(*Context).Term(0xc208092f58, 0x0, 0x0)
        /PROJECTROOT/src/github.com/pebbe/zmq4/zmq4.go:118 +0x3c fp=0x7fab4a51aeb8 sp=0x7fab4a51ae80
crashTest.TestCrash(0xc208068090)
        /PROJECTROOT/src/crash_test.go:37 +0x4fe fp=0x7fab4a51af68 sp=0x7fab4a51aeb8
testing.tRunner(0xc208068090, 0x84bbe0)
        /usr/local/go/src/pkg/testing/testing.go:422 +0x8b fp=0x7fab4a51af98 sp=0x7fab4a51af68
runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445 fp=0x7fab4a51afa0 sp=0x7fab4a51af98
created by testing.RunTests
        /usr/local/go/src/pkg/testing/testing.go:504 +0x8db

[further stack trace omitted]

Getting following error while installing

github.com/pebbe/zmq4

C:\cloudsrc\src\github.com\pebbe\zmq4\auth.go:333: undefined: Socket
C:\cloudsrc\src\github.com\pebbe\zmq4\auth.go:342: undefined: Socket
C:\cloudsrc\src\github.com\pebbe\zmq4\auth.go:351: undefined: Socket
C:\cloudsrc\src\github.com\pebbe\zmq4\auth.go:363: undefined: Socket
C:\cloudsrc\src\github.com\pebbe\zmq4\auth.go:372: undefined: Socket
C:\cloudsrc\src\github.com\pebbe\zmq4\reactor.go:10: undefined: State
C:\cloudsrc\src\github.com\pebbe\zmq4\reactor.go:11: undefined: State

Support of cross-compilation?

Hi,

It's not an "issue" per se, sorry if it's not appropriate, I just don't know where's the best place to ask this kind of question: I got the following error when cross-compiling my code which uses zmq:

[vagrant@localhost coordnode]$ GOARM=7 GOARCH=arm GOOS=linux go build
# github.com/pebbe/zmq4
../../pebbe/zmq4/auth.go:544: undefined: Socket
../../pebbe/zmq4/auth.go:553: undefined: Socket
../../pebbe/zmq4/auth.go:562: undefined: Socket
../../pebbe/zmq4/auth.go:574: undefined: Socket
../../pebbe/zmq4/auth.go:583: undefined: Socket
../../pebbe/zmq4/reactor.go:10: undefined: State
../../pebbe/zmq4/reactor.go:11: undefined: State

Socket and State are variables defined in the package, as far as I understand. So this error is rather weird to me. Any suggestion? Thanks!

Merge in Channels from vaughan0/go-zmq?

First off let me thank you for both writing, and maintaining this library.

I recently switched to it from github.com/vaughan0/go-zmq, mostly because there were some issues with that library I could not quite explain (like my inability to set a hwm despite doing everything I could think of including writing the cgo calls on every socket created for testing.)

The one thing I really miss is the abstraction given using Socket.Channels(). What I am doing, done the standard zmq way, would have me reading from a Router tcp socket, and sending work to a Dealer inproc, and having goroutines reading from that inproc, and then having the main process using a poller to read from the Dealer and write back out on the Router (I forget the name of this pattern at the moment.)

But the Channels abstraction is really nice. It creates a Pair in a single goroutine and uses go channels to communicate between the In and Out. Because so much of my code already relied on this paradigm, I spent some time and ported the channels.go file (https://github.com/vaughan0/go-zmq/blob/master/channels.go) to work with your library (mostly name changes for constants, and some type changes to match what you have done.)

I am wondering if you have any interest in adding this to zmq4? I could submit a pull request but wanted to make sure it was even something you would consider before going through with it.

Thanks again.

context object

I tried the bindings. There is no context object? I'm missing something like the following in the examples.

context, _ := zmq.NewContext()

Stuck with idiomatic way for low-latency Send/Recv

Hi Peter,

I'm lost trying to figure this out for days, I'm probably missing the point, can you point me in the right direction?

I want to send/recv messages concurrently with a ROUTER.
The code below describes how it's done logically.
The code either polls or sends a message.
If TIMEOUT is big, say 10s, outgoing messages are blocked.
If TIMEOUT is small, say 10us, processor usage goes 100%.
Now what?

func Listen() {
    poller := zmq.NewPoller()
    poller.Add(socket, zmq.POLLIN)

    for {
        polled, _ := poller.Poll(TIMEOUT)
        handleIncoming(polled)

        sendAnyMessages()
    }
}

Any hint is appreciated.

Migrating from gozmq with build tag based versioning

Hello,

It seems gozmq is going inactive and it's recommended to make the move to these libraries!
I'm just wondering best way to go about this... I relied on the tags to enable ZMQ4 features so that users with ZMQ3 could still build my binary with distribution provided ZMQ3 libraries. If the user had ZMQ4 installed though they could activate those features by enabling a tag.

However, it seems here we have 3 libraries, zmq2, zmq3 and zmq4, with no option but to import one or the other, regardless of tags. Any thoughts on an approach?

Jason

SetRate not working

publisher, err := zmq.NewSocket(zmq.PUB)
publisher.SetRate(31415)  // about 31.415Mbps

Still getting:
Trace: Setting ODATA rate regulation to 12500 bytes per second

Assertion failed: pfd.revents & POLLIN (signaler.cpp:226)

I'm using zerorpc golang binding it's fine at beginning however when there are more than 10 clients
It will throw this error

2015/06/29 23:10:21 ZeroRPC socket closed
Assertion failed: pfd.revents & POLLIN (signaler.cpp:226)
SIGABRT: abort
PC=0x7ffbcf34ccc9
signal arrived during cgo execution

goroutine 152 [syscall, locked to thread]:
runtime.cgocall_errno(0x4035b0, 0xc2080b3cc0, 0x0)
        /home/meng/projects/go/src/runtime/cgocall.go:130 +0xf5 fp=0xc2080b3c80 sp=0xc2080b3c58
github.com/pebbe/zmq4._C2func_zmq_msg_recv(0xc2080b3d00, 0x7ffb9c015aa0, 0x0, 0x0, 0x0, 0x0)
        /home/meng/projects/PQServer/goedge/src/github.com/pebbe/zmq4/:225 +0x55 fp=0xc2080b3cc0 sp=0xc2080b3c80
github.com/pebbe/zmq4.(*Socket).RecvBytes(0xc2080c3e30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/meng/projects/PQServer/goedge/src/github.com/pebbe/zmq4/zmq4.go:682 +0x2c5 fp=0xc2080b3dd8 sp=0xc2080b3cc0
github.com/pebbe/zmq4.(*Socket).RecvMessageBytes(0xc2080c3e30, 0x0, 0xf032b0, 0x0, 0x0, 0x0, 0x0)
        /home/meng/projects/PQServer/goedge/src/github.com/pebbe/zmq4/utils.go:118 +0xc0 fp=0xc2080b3e60 sp=0xc2080b3dd8
github.com/mengzhuo/zerorpc.(*socket).listen(0xc208185600)
        /home/meng/projects/PQServer/goedge/src/github.com/mengzhuo/zerorpc/socket.go:121 +0x78 fp=0xc2080b3fd8 sp=0xc2080b3e60
runtime.goexit()
        /home/meng/projects/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc2080b3fe0 sp=0xc2080b3fd8
created by github.com/mengzhuo/zerorpc.connect
        /home/meng/projects/PQServer/goedge/src/github.com/mengzhuo/zerorpc/socket.go:41 +0x2ff

goroutine 1 [IO wait]:
net.(*pollDesc).Wait(0xc2080c6680, 0x72, 0x0, 0x0)
        /home/meng/projects/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc2080c6680, 0x0, 0x0)
        /home/meng/projects/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).accept(0xc2080c6620, 0x0, 0x7ffbcfd94e60, 0xc208079678)
        /home/meng/projects/go/src/net/fd_unix.go:419 +0x40b
net.(*TCPListener).AcceptTCP(0xc2080440f8, 0xc2080b3e50, 0x0, 0x0)
        /home/meng/projects/go/src/net/tcpsock_posix.go:234 +0x4e
net.(*TCPListener).Accept(0xc2080440f8, 0x0, 0x0, 0x0, 0x0)
        /home/meng/projects/go/src/net/tcpsock_posix.go:244 +0x4c
goroutine 184 [sleep]:
github.com/mengzhuo/zerorpc.(*channel).sendHeartbeats(0xc2080c6540)
        /home/meng/projects/PQServer/goedge/src/github.com/mengzhuo/zerorpc/channel.go:132 +0x35
created by github.com/mengzhuo/zerorpc.(*channel).sendEvent
        /home/meng/projects/PQServer/goedge/src/github.com/mengzhuo/zerorpc/channel.go:104 +0x318

rax     0x0
rbx     0x02015/06/29 23:10:22 ZeroRPC socket created new channel

rcx     0xffffffffffffffff2015/06/29 23:10:22 Channel 3414f9f7-a197-4941-7482-945bb0582840 sending event 3414f9f7-a197-4941-7482-945bb0582840

rdx     0x6
rdi     0x6e22
2015/06/29 23:10:22 ZeroRPC socket sent event 3414f9f7-a197-4941-7482-945bb0582840
rsi     0x6e3f
rbp     0x1
rsp     2015/06/29 23:10:22 ZeroRPC socket sent 99 bytes
2015/06/29 23:10:22 ZeroRPC socket listening for incoming data
2015/06/29 23:10:22 ZeroRPC socket received 129 bytes
2015/06/29 23:10:22 ZeroRPC socket recieved event 4bf2cc48-7d6e-4066-b57b-57cbb11c9948
2015/06/29 23:10:22 ZeroRPC socket routing event 4bf2cc48-7d6e-4066-b57b-57cbb11c9948 to channel 21435e0f-0e1b-48cb-55a3-e4449f16dfb1
0x7ffb9b7fdbb8
r8      0x7ffb9b7fe700
r9      0xe2
r10     0x8
r11     0x206
r12     0xffffffff
r13     0xffffffff
r14     0x0
r15     0x7ffb9c015f40
rip     0x7ffbcf34ccc9
rflags  0x206
cs      0x33
fs      0x0
gs      0x0
exit status 2

installing problem with C.ZMQ_HWM

I have problem getting started with zeromq while getting this package built. After installing libzmq ( latest stable one ) and while getting this one, I have this error :

# github.com/alecthomas/gozmq
could not determine kind of name for C.ZMQ_HWM
could not determine kind of name for C.ZMQ_MCAST_LOOP
could not determine kind of name for C.ZMQ_RECOVERY_IVL_MSEC
could not determine kind of name for C.ZMQ_SWAP
make: *** [deps] Error 2

Fails to compile on FreeBSD10

Gets an error on compilation on FreeBSD 10:

cc did not produce error at completed:1

Apparently happens because cgo is reading error messages from the compiler and detects end of the
the file by detecting that particular message. The compiler on FreeBSD 10 is clang and by default has a low limit on errors.

I was able to increase the error limit and disable a gcc specific warning such that it compiled and all tests passed (see note 1)

I just added this to the other #cgo lines in zmq4.go

#cgo freebsd CFLAGS: -ferror-limit=9999 -Wno-attributes

Notes:

  1. to get the Example_test_abstract_ipc i had to change ipc://@/tmp/tester to ipc:///tmp/tester. See the page: http://api.zeromq.org/4-1:zmq-ipc to see the ipc:///name format

go install "could not determine kind of name for C.ZMQ_CURVE_PUBLICKEY "

➜  http-test  go get github.com/pebbe/zmq4
# github.com/pebbe/zmq4
could not determine kind of name for C.ZMQ_CURVE_PUBLICKEY
could not determine kind of name for C.ZMQ_CURVE_SECRETKEY
could not determine kind of name for C.ZMQ_CURVE_SERVERKEY
could not determine kind of name for C.ZMQ_GSSAPI_PLAINTEXT
could not determine kind of name for C.ZMQ_GSSAPI_PRINCIPAL
could not determine kind of name for C.ZMQ_GSSAPI_SERVER
could not determine kind of name for C.ZMQ_GSSAPI_SERVICE_PRINCIPAL
could not determine kind of name for C.ZMQ_HANDSHAKE_IVL
could not determine kind of name for C.ZMQ_IMMEDIATE
could not determine kind of name for C.ZMQ_IPV6
could not determine kind of name for C.ZMQ_LAST_ENDPOINT
could not determine kind of name for C.ZMQ_MAXMSGSIZE
could not determine kind of name for C.ZMQ_MECHANISM
could not determine kind of name for C.ZMQ_MULTICAST_HOPS
could not determine kind of name for C.ZMQ_PLAIN_PASSWORD
could not determine kind of name for C.ZMQ_PLAIN_SERVER
could not determine kind of name for C.ZMQ_PLAIN_USERNAME
could not determine kind of name for C.ZMQ_RCVHWM
could not determine kind of name for C.ZMQ_SNDHWM
could not determine kind of name for C.ZMQ_SOCKS_PROXY
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE_CNT
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE_IDLE
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE_INTVL
could not determine kind of name for C.ZMQ_TOS
could not determine kind of name for C.ZMQ_ZAP_DOMAIN


➜  http-test  go version
go version go1.4 linux/amd64


➜  http-test  gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 

➜  http-test  uname -a
Linux wkc-pc 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

AuthStop() and Term() causes a hang on shutdown

zmq4 version: 4b5b072 (latest)
zeromq-4.1.3 (latest)
libsodium: 1.0.3 (latest)

There appears to be a race condition with the AuthStop() and Term() functions. Steps to reproduce the problem:

  1. Run the below code
  2. Wait 2 seconds and ctrl-c.
  3. It will hang within 3-5 tries.
  4. A second ctrl-c exists the program.

Comment-out the AuthStop() and Term() code below and the program exits cleanly upon ctrl-c.

Workaround: Do not use AuthStop() and Term(). The program will end just fine.

package main

import (
        "log"
        "os"
        "os/signal"
        "syscall"
        "time"

        z "github.com/pebbe/zmq4"
)

func main() {
        us_public_key := "VVPVGyASr0?}lkRR28ULJj}N4Ut-NC>Q?qZ6!F3N"
        us_secret_key := "lU9<Y]^0CG*gI6N7Gyx.Sb/Q5:SX=[3moZv>B<c9"
        them_public_key := "K!y%@qX/ukA=Tw0E+#Lt.]k{Xu9yzZFf66TK&L@R"
        defer log.Println("After Term(), stopped")
        defer z.Term() // Comment-out to avoid hang
        defer log.Println("before Term()")
        z.AuthStart()
        defer z.AuthStop() // Comment-out to avoid hang
        defer log.Println("before AuthStop()")
        z.AuthCurveAdd("*", them_public_key)
        defer z.AuthCurveRemoveAll("*")
        sock, _ := z.NewSocket(z.ROUTER)
        defer sock.Close()
        sock.SetIdentity("a")
        sock.ClientAuthCurve(them_public_key, us_public_key, us_secret_key)
        connect := "tcp://127.0.0.1:5000"
        sock.SetReconnectIvl(time.Second * 1)
        sock.SetReconnectIvlMax(time.Second * 1)
        sock.Connect(connect)
        defer sock.Disconnect(connect)
        defer sock.SetLinger(0)
        sigc := make(chan os.Signal, 10)
        signal.Notify(sigc, os.Interrupt, syscall.SIGTERM)
        log.Println("Waiting ..")
        <-time.After(3 * time.Second)
        log.Println("ok to ctrl-c")
        <-sigc
        log.Println("received sigc")
}

Also hangs with zeromq-3.2.5.

Thank you for creating the golang library. Works great.

socket.Close() crashes while socket.RecvBytes()

Hi Peter,

thanks for sharing this lib.
I wrote some stress-tests for my app which caused zmq to crash.

A testcase that that consistently crashes for me

package crashTest

import (
    "testing"
    zmq "github.com/pebbe/zmq4"
)

func TestCrash(t *testing.T) {
    context, err := zmq.NewContext()
    if err != nil { t.Fatal(err) }
    defer context.Term()

    wait := make(chan bool, 1)
    for i:=0; i<1000; i++ {
        socket, err := context.NewSocket(zmq.ROUTER)
        if err != nil { t.Fatal(err) }

        // Retry opening a socket until it becomes free
        for {
            err = socket.Bind("tcp://127.0.0.1:5555")
            if err == nil {
                break
            }
        }

        go func() {
            wait <- true // Make sure we reach this point before socket.Close()

            // We expect RecvMessage to return an error upon closing the socket
            // but not to crash the app, which it does
            _, _ = socket.RecvBytes(0)
        }()
        <- wait

        err = socket.Close()
        if err != nil { t.Fatal(err) }
    }
}

Crash message:

$ go test
Assertion failed: pfd.revents & POLLIN (signaler.cpp:193)
SIGABRT: abort
PC=0x7fef5bd5bf79
signal arrived during cgo execution

goroutine 22 [syscall]:
runtime.cgocall(0x402a10, 0x7fef5c57fea8)
        /usr/local/go/src/pkg/runtime/cgocall.c:143 +0xe5 fp=0x7fef5c57fe80 sp=0x7fef5c57fe38
github.com/pebbe/zmq4._C2func_zmq_msg_recv(0xc2080400a0, 0x7fef500008c0, 0x0, 0x0, 0x0, 0x0)
        github.com/pebbe/zmq4/_obj/_cgo_defun.c:342 +0x31 fp=0x7fef5c57fea8 sp=0x7fef5c57fe80
github.com/pebbe/zmq4.(*Socket).RecvBytes(0xc2080004c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /PROJECTROOT/src/github.com/pebbe/zmq4/zmq4.go:588 +0x18d fp=0x7fef5c57ff58 sp=0x7fef5c57fea8
crashTest.func·001()
        /PROJECTROOT/src/crash_test.go:30 +0x64 fp=0x7fef5c57ffa8 sp=0x7fef5c57ff58
runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445 fp=0x7fef5c57ffb0 sp=0x7fef5c57ffa8
created by crashTest.TestCrash
        /PROJECTROOT/src/crash_test.go:31 +0x2bb

[further stack trace omitted]

Can you fix it or suggest a way to get around it somehow?

Poller with closed Socket

Poller acts strangely with closed sockets. The following test fails:

package main

import "github.com/pebbe/zmq4"
import "testing"

func Test(t *testing.T) {
  ctx, _ := zmq4.NewContext()
  socket, _ := ctx.NewSocket(zmq4.ROUTER)
  socket.Close()

  poll := zmq4.NewPoller()
  poll.Add(socket, zmq4.POLLIN)

  polled, err := poll.Poll(0)

  if err == nil {
    t.Errorf("Expected an error, maybe")
  }

  if len(polled) > 0 {
    t.Errorf("Expected no items: %v", polled)
  }
}
--- FAIL: Test (0.00 seconds)
        poll_test.go:17: Expected an error, maybe
        poll_test.go:21: Expected no items: [{Socket(PAIR,0x0) POLLIN}]
FAIL
exit status 1

Assertion failed: pfd.revents & POLLIN (signaler.cpp:193)

when i cycle call NewContext()->NewSocket()->socket.close()->context.term(), some times later, this problem appears and the program crash。Or maybe, the progress block in term(). Or maybe,it crash in term() with "Assertion failed: ok (mailbox.cpp:82)".

Undefined symbols for architecture x86_64

I'll get "Undefined symbols" error when running go get github.com/pebbe/zmq4.
My system is Mac OS X (Version 10.9.5)

Log here

# github.com/pebbe/zmq4
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find(char const*, unsigned long, unsigned long) const", referenced from:
      zmq::socket_base_t::parse_uri(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-socket_base.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from:
      zmq::socket_base_t::check_protocol(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::term_endpoint(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::monitor(char const*, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::tcp_address_t::resolve(char const*, bool, bool) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::tcp_address_mask_t::resolve(char const*, bool) in libzmq.a(libzmq_la-tcp_address.o)
      ...
  "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:
      void std::__1::vector<zmq::pipe_t*, std::__1::allocator<zmq::pipe_t*> >::__push_back_slow_path<zmq::pipe_t* const>(zmq::pipe_t* const&) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> >::vector(std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> > const&) in libzmq.a(libzmq_la-socket_base.o)
      void std::__1::vector<zmq::socket_base_t*, std::__1::allocator<zmq::socket_base_t*> >::__push_back_slow_path<zmq::socket_base_t* const>(zmq::socket_base_t* const&) in libzmq.a(libzmq_la-ctx.o)
      void std::__1::vector<unsigned int, std::__1::allocator<unsigned int> >::__push_back_slow_path<unsigned int const>(unsigned int const&) in libzmq.a(libzmq_la-ctx.o)
      void std::__1::vector<zmq::io_thread_t*, std::__1::allocator<zmq::io_thread_t*> >::__push_back_slow_path<zmq::io_thread_t* const>(zmq::io_thread_t* const&) in libzmq.a(libzmq_la-ctx.o)
      std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> >::vector(std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> > const&) in libzmq.a(libzmq_la-ctx.o)
      std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> >::vector(std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> > const&) in libzmq.a(libzmq_la-own.o)
      ...
  "std::__1::__basic_string_common<true>::__throw_length_error() const", referenced from:
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str() const in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str() const in libzmq.a(libzmq_la-tcp_address.o)
      zmq::pipe_t::get_identity() in libzmq.a(libzmq_la-pipe.o)
      std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> >::__grow_by_and_replace(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned char const*) in libzmq.a(libzmq_la-pipe.o)
      zmq::xpub_t::xread_activated(zmq::pipe_t*) in libzmq.a(libzmq_la-xpub.o)
      zmq::xpub_t::send_unsubscription(unsigned char*, unsigned long, void*) in libzmq.a(libzmq_la-xpub.o)
      std::__1::deque<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> >, std::__1::allocator<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> > > >::push_back(std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> > const&) in libzmq.a(libzmq_la-xpub.o)
      ...
  "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)", referenced from:
      zmq::socket_base_t::stop_monitor() in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::parse_uri(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::add_endpoint(char const*, zmq::own_t*, zmq::pipe_t*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::term_endpoint(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ctx_t::register_endpoint(char const*, zmq::endpoint_t&) in libzmq.a(libzmq_la-ctx.o)
      zmq::ctx_t::find_endpoint(char const*) in libzmq.a(libzmq_la-ctx.o)
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*)", referenced from:
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::tcp_address_mask_t::resolve(char const*, bool) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::ipc_listener_t::set_address(char const*) in libzmq.a(libzmq_la-ipc_listener.o)
      zmq::get_peer_ip_address(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ip.o)
      zmq::stream_engine_t::stream_engine_t(int, zmq::options_t const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-stream_engine.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*, unsigned long)", referenced from:
      zmq::tcp_address_mask_t::resolve(char const*, bool) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::options_t::setsockopt(int, void const*, unsigned long) in libzmq.a(libzmq_la-options.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::resize(unsigned long, char)", referenced from:
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::push_back(char)", referenced from:
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::add_endpoint(char const*, zmq::own_t*, zmq::pipe_t*) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> > > >::__insert_multi(std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> > const&) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*> > >::__insert_multi(std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*> const&) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ctx_t::terminate() in libzmq.a(libzmq_la-ctx.o)
      zmq::ctx_t::register_endpoint(char const*, zmq::endpoint_t&) in libzmq.a(libzmq_la-ctx.o)
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, std::__1::allocator<char> const&)", referenced from:
      zmq::socket_base_t::parse_uri(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-socket_base.o)
      zmq::tcp_address_t::resolve(char const*, bool, bool) in libzmq.a(libzmq_la-tcp_address.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
      zmq::socket_base_t::socket_base_t(zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::stop_monitor() in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::parse_uri(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::add_endpoint(char const*, zmq::own_t*, zmq::pipe_t*) in libzmq.a(libzmq_la-socket_base.o)
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      zmq::socket_base_t::parse_uri(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ipc_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-ipc_address.o)
      zmq::tcp_address_t::resolve(char const*, bool, bool) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::tcp_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::tcp_address_mask_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-tcp_address.o)
      ...
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(int)", referenced from:
      zmq::tcp_address_mask_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(unsigned short)", referenced from:
      zmq::tcp_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
  "std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      zmq::ipc_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      ...
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::sync()", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::imbue(std::__1::locale const&)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::uflow()", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::setbuf(char*, long)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::xsgetn(char*, long)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::xsputn(char const*, long)", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::showmanyc()", referenced from:
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      vtable for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::basic_streambuf()", referenced from:
      zmq::ipc_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ipc_address.o)
      zmq::tcp_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::tcp_address_mask_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) const in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::~basic_streambuf()", referenced from:
      zmq::ipc_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      ...
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::ios_base::init(void*)", referenced from:
      zmq::ipc_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ipc_address.o)
      zmq::tcp_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::tcp_address_mask_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-tcp_address.o)
      zmq::address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) const in libzmq.a(libzmq_la-address.o)
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
  "std::__1::basic_ios<char, std::__1::char_traits<char> >::~basic_ios()", referenced from:
      zmq::ipc_address_t::to_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      non-virtual thunk to std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringstream() in libzmq.a(libzmq_la-ipc_address.o)
      ...
  "std::nothrow", referenced from:
      _zmq_ctx_new in libzmq.a(libzmq_la-zmq.o)
      zmq::socket_base_t::create(int, zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ctx_t::create_socket(int) in libzmq.a(libzmq_la-ctx.o)
      zmq::io_thread_t::io_thread_t(zmq::ctx_t*, unsigned int) in libzmq.a(libzmq_la-io_thread.o)
      zmq::ipc_listener_t::in_event() in libzmq.a(libzmq_la-ipc_listener.o)
      ...
  "std::terminate()", referenced from:
      ___clang_call_terminate in libzmq.a(libzmq_la-zmq.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-socket_base.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-ctx.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-io_thread.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-ipc_address.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-tcp_address.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-ipc_listener.o)
      ...
  "typeinfo for std::__1::basic_istream<char, std::__1::char_traits<char> >", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "typeinfo for std::__1::basic_ostream<char, std::__1::char_traits<char> >", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "typeinfo for std::__1::basic_iostream<char, std::__1::char_traits<char> >", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "typeinfo for std::__1::basic_streambuf<char, std::__1::char_traits<char> >", referenced from:
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "vtable for __cxxabiv1::__class_type_info", referenced from:
      typeinfo for zmq::array_item_t<0> in libzmq.a(libzmq_la-socket_base.o)
      typeinfo for zmq::i_poll_events in libzmq.a(libzmq_la-socket_base.o)
      typeinfo for zmq::i_pipe_events in libzmq.a(libzmq_la-socket_base.o)
      typeinfo for zmq::i_poll_events in libzmq.a(libzmq_la-io_thread.o)
      typeinfo for zmq::tcp_address_t in libzmq.a(libzmq_la-tcp_address.o)
      typeinfo for zmq::i_pipe_events in libzmq.a(libzmq_la-session_base.o)
      typeinfo for zmq::array_item_t<1> in libzmq.a(libzmq_la-pipe.o)
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for __cxxabiv1::__si_class_type_info", referenced from:
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      typeinfo for zmq::tcp_address_mask_t in libzmq.a(libzmq_la-tcp_address.o)
      typeinfo for std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      typeinfo for std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      typeinfo for zmq::own_t in libzmq.a(libzmq_la-own.o)
      typeinfo for zmq::pub_t in libzmq.a(libzmq_la-pub.o)
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for __cxxabiv1::__vmi_class_type_info", referenced from:
      typeinfo for zmq::socket_base_t in libzmq.a(libzmq_la-socket_base.o)
      typeinfo for zmq::io_thread_t in libzmq.a(libzmq_la-io_thread.o)
      typeinfo for zmq::ipc_listener_t in libzmq.a(libzmq_la-ipc_listener.o)
      typeinfo for zmq::session_base_t in libzmq.a(libzmq_la-session_base.o)
      typeinfo for zmq::tcp_listener_t in libzmq.a(libzmq_la-tcp_listener.o)
      typeinfo for zmq::pipe_t in libzmq.a(libzmq_la-pipe.o)
      typeinfo for zmq::reaper_t in libzmq.a(libzmq_la-reaper.o)
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "non-virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_istream<char, std::__1::char_traits<char> >::~basic_istream()", referenced from:
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_istream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()", referenced from:
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_ostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "non-virtual thunk to std::__1::basic_iostream<char, std::__1::char_traits<char> >::~basic_iostream()", referenced from:
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-ipc_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-tcp_address.o)
      construction vtable for std::__1::basic_iostream<char, std::__1::char_traits<char> >-in-std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > in libzmq.a(libzmq_la-address.o)
  "operator delete(void*)", referenced from:
      _zmq_threadclose in libzmq.a(libzmq_la-zmq_utils.o)
      zmq::socket_base_t::socket_base_t(zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      non-virtual thunk to zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      non-virtual thunk to zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      non-virtual thunk to zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      ...
  "operator delete(void*, std::nothrow_t const&)", referenced from:
      _zmq_ctx_new in libzmq.a(libzmq_la-zmq.o)
      zmq::socket_base_t::create(int, zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ctx_t::create_socket(int) in libzmq.a(libzmq_la-ctx.o)
      zmq::io_thread_t::io_thread_t(zmq::ctx_t*, unsigned int) in libzmq.a(libzmq_la-io_thread.o)
      zmq::ipc_listener_t::in_event() in libzmq.a(libzmq_la-ipc_listener.o)
      ...
  "operator new(unsigned long)", referenced from:
      _zmq_threadstart in libzmq.a(libzmq_la-zmq_utils.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> > > >::__insert_multi(std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> > const&) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*> > >::__insert_multi(std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*> const&) in libzmq.a(libzmq_la-socket_base.o)
      void std::__1::vector<zmq::pipe_t*, std::__1::allocator<zmq::pipe_t*> >::__push_back_slow_path<zmq::pipe_t* const>(zmq::pipe_t* const&) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> >::vector(std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> > const&) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::endpoint_t, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, zmq::endpoint_t> > >::__construct_node_with_key(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libzmq.a(libzmq_la-ctx.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pending_connection_t>, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pending_connection_t>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pending_connection_t> > >::__construct_node(std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pending_connection_t> const&) in libzmq.a(libzmq_la-ctx.o)
      ...
  "operator new(unsigned long, std::nothrow_t const&)", referenced from:
      _zmq_ctx_new in libzmq.a(libzmq_la-zmq.o)
      zmq::socket_base_t::create(int, zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ctx_t::create_socket(int) in libzmq.a(libzmq_la-ctx.o)
      zmq::io_thread_t::io_thread_t(zmq::ctx_t*, unsigned int) in libzmq.a(libzmq_la-io_thread.o)
      zmq::ipc_listener_t::in_event() in libzmq.a(libzmq_la-ipc_listener.o)
      ...
  "___cxa_begin_catch", referenced from:
      ___clang_call_terminate in libzmq.a(libzmq_la-zmq.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-socket_base.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-ctx.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-io_thread.o)
      ___clang_call_terminate in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-ipc_address.o)
      ...
  "___cxa_call_unexpected", referenced from:
      zmq::socket_base_t::bind(char const*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::connect(char const*) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> >::vector(std::__1::vector<zmq::tcp_address_mask_t, std::__1::allocator<zmq::tcp_address_mask_t> > const&) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> > > >::destroy(std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<zmq::own_t*, zmq::pipe_t*> >, void*>*) in libzmq.a(libzmq_la-socket_base.o)
      std::__1::__tree<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, std::__1::__map_value_compare<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*> > >::destroy(std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zmq::pipe_t*>, void*>*) in libzmq.a(libzmq_la-socket_base.o)
      zmq::ctx_t::terminate() in libzmq.a(libzmq_la-ctx.o)
      zmq::ctx_t::register_endpoint(char const*, zmq::endpoint_t&) in libzmq.a(libzmq_la-ctx.o)
      ...
  "___cxa_end_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-ipc_address.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in libzmq.a(libzmq_la-tcp_address.o)
      std::__1::deque<unsigned char, std::__1::allocator<unsigned char> >::__add_back_capacity() in libzmq.a(libzmq_la-xpub.o)
      std::__1::deque<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> >, std::__1::allocator<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> > > >::__add_back_capacity() in libzmq.a(libzmq_la-xpub.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libzmq.a(libzmq_la-address.o)
      ...
  "___cxa_pure_virtual", referenced from:
      vtable for zmq::socket_base_t in libzmq.a(libzmq_la-socket_base.o)
      vtable for zmq::mechanism_t in libzmq.a(libzmq_la-mechanism.o)
      vtable for zmq::decoder_base_t<zmq::v1_decoder_t> in libzmq.a(libzmq_la-v1_decoder.o)
      vtable for zmq::decoder_base_t<zmq::v2_decoder_t> in libzmq.a(libzmq_la-v2_decoder.o)
  "___cxa_rethrow", referenced from:
      std::__1::deque<unsigned char, std::__1::allocator<unsigned char> >::__add_back_capacity() in libzmq.a(libzmq_la-xpub.o)
      std::__1::deque<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> >, std::__1::allocator<std::__1::basic_string<unsigned char, std::__1::char_traits<unsigned char>, std::__1::allocator<unsigned char> > > >::__add_back_capacity() in libzmq.a(libzmq_la-xpub.o)
  "___gxx_personality_v0", referenced from:
      _zmq_ctx_new in libzmq.a(libzmq_la-zmq.o)
      _zmq_poll in libzmq.a(libzmq_la-zmq.o)
      Dwarf Exception Unwind Info (__eh_frame) in libzmq.a(libzmq_la-zmq.o)
      zmq::socket_base_t::create(int, zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::socket_base_t(zmq::ctx_t*, unsigned int, int) in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::~socket_base_t() in libzmq.a(libzmq_la-socket_base.o)
      zmq::socket_base_t::stop_monitor() in libzmq.a(libzmq_la-socket_base.o)
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

possible bug with SetIpv6

On FreeBSD10.1 setting IPv6 mode gives error when binding to IPv4 address, the zeromq documentation seems to imply that setting this true will allow both.

Here is the test program:

// IPv4/IPv6 test

package main

import (
    zmq "github.com/pebbe/zmq4"
    "fmt"
)

func main() {

    b := []bool{false, true}

    for _, f := range b {

        socket, err := zmq.NewSocket(zmq.ROUTER)
        if checkError("NewSocket", err) {
            return
        }

        checkError(fmt.Sprintf("SetIpv6: %v", f), socket.SetIpv6(f))

        checkError("Bind tcp4", socket.Bind("tcp://127.0.0.1:5555"))
        checkError("Bind tcp6", socket.Bind("tcp://[::1]:5555"))

        socket.Close()
    }
}

func checkError(title string, err error) bool {
    if nil != err {
        fmt.Printf("%s: err = %v\n", title, err)
        return true
    } else {
        fmt.Printf("%s: OK\n", title)
    }
    return false
}

And my results:

NewSocket: OK
SetIpv6: false: OK
Bind tcp4: OK
Bind tcp6: err = operation not supported by device
NewSocket: OK
SetIpv6: true: OK
Bind tcp4: err = operation not supported by device
Bind tcp6: OK

I expect the first tcp6 error as IPv6 is disabled, but not the tcp4 error.

Do you know if this is expected behaviour? (and I need separate IPv4/IPv6 sockets)
(I will see if I can do a Linux test later)

EPGM not supported?

OS: Ubuntu/3.13.0-34-generic
go version go1.4 linux/amd64

sender.go

package main

import (
        zmq "github.com/pebbe/zmq4"

        "log"
        "os"
        "time"
)

func main() {
        publisher, err := zmq.NewSocket(zmq.PUB)

        if err != nil {
                log.Fatal(err)
        }

        if len(os.Args) == 2 {
                publisher.Connect(os.Args[1])
                log.Printf(os.Args[1])
        } else {
                publisher.Connect("epgm://eth0;239.0.0.1:5566")
        }
        defer publisher.Close()

        log.Printf("Publisher bind to: %s", publisher)

        for {
                publisher.SendMessage("Hi")
                time.Sleep(1 * time.Second)
                log.Printf("Sended")
        }
}

recv.go

package main

import (
        zmq "github.com/pebbe/zmq4"

        "log"
        "os"
)

func main() {
        subscriber, err := zmq.NewSocket(zmq.SUB)

        if err != nil {
                log.Fatal(err)
        }

        if len(os.Args) == 2 {
                subscriber.Connect(os.Args[1])
                log.Printf(os.Args[1])
        } else {
                subscriber.Connect("epgm://239.0.0.1:5566")
        }
        defer subscriber.Close()
        subscriber.SetSubscribe("")

        for {
                msg, e := subscriber.RecvMessage(0)

                if e != nil {
                        return
                }
                log.Printf("Recv: %s", msg)
        }
}

Neither the recv.go nor Wireshark filtering "udp.dstport == 5566" receving any package.

Minor: OpenPGM 5.2.122 (1487) 2015-01-06 09:38:32 Linux x86_64
Minor: Detected 2 available 2 online 2 configured CPUs.
Minor: Using gettimeofday() timer.

Tests fail with ZeroMQ version 4.1.0

These tests fail with ZeroMQ version 4.1.0:

  • Example_test_connect_resolve
  • Example_test_security_curve

4.1.0 is still under development. Let's hope the tests are OK when 4.1.0 is stable.

Context issues

We've been using your library to build a thin inter-service communication layer on top of zmq. Recently when testing more extensively we ran into a major issue with this lib which forced us to migrate to alecthomas's lib. Now when he officially put it in maintenance mode I thought we should work this out together:

The issue is when connecting a "client" to multiple "servers", there is only one zmq.Context created (in init()). We have clients that connects to multiple backing services via different sockets but since the init() is only run once it only creates one context which makes client connections to multiple backends impossible. At least that's what our investigations found, and switching to alecthomas's which lets you manually create contexts made it work.

To clarify: It works just fine to bind one socket to multiple endpoints, the issue is when creating multiple sockets. Maybe there already is a solution already but otherwise I suggest something like this not to break the API:

  • Introduce the concept of Context (exported) and basically support creating Contexts and a few methods for creating socket(s) in that context (we could probably borrow some code from alecthomas here).
  • Keep the current implementation of a "global" context for use cases not dealing with contexts and also (mainly) not to break current API.

Module doesn't compile anymore on go1.5rc1

Here is what happens:

$ go get github.com/pebbe/zmq4
# github.com/pebbe/zmq4
could not determine kind of name for C.ZMQ_CURVE_PUBLICKEY
could not determine kind of name for C.ZMQ_CURVE_SECRETKEY
could not determine kind of name for C.ZMQ_CURVE_SERVERKEY
could not determine kind of name for C.ZMQ_GSSAPI_PLAINTEXT
could not determine kind of name for C.ZMQ_GSSAPI_PRINCIPAL
could not determine kind of name for C.ZMQ_GSSAPI_SERVER
could not determine kind of name for C.ZMQ_GSSAPI_SERVICE_PRINCIPAL
could not determine kind of name for C.ZMQ_HANDSHAKE_IVL
could not determine kind of name for C.ZMQ_IMMEDIATE
could not determine kind of name for C.ZMQ_IPV6
could not determine kind of name for C.ZMQ_LAST_ENDPOINT
could not determine kind of name for C.ZMQ_MAXMSGSIZE
could not determine kind of name for C.ZMQ_MECHANISM
could not determine kind of name for C.ZMQ_MULTICAST_HOPS
could not determine kind of name for C.ZMQ_PLAIN_PASSWORD
could not determine kind of name for C.ZMQ_PLAIN_SERVER
could not determine kind of name for C.ZMQ_PLAIN_USERNAME
could not determine kind of name for C.ZMQ_RCVHWM
could not determine kind of name for C.ZMQ_SNDHWM
could not determine kind of name for C.ZMQ_SOCKS_PROXY
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE_CNT
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE_IDLE
could not determine kind of name for C.ZMQ_TCP_KEEPALIVE_INTVL
could not determine kind of name for C.ZMQ_TOS
could not determine kind of name for C.ZMQ_ZAP_DOMAIN

Create some documentation on how to build for windows

Not strictly an "issue" but it would be very helpful to have some documentation on how to get this working on Windows. go get doesn't seem to get the zmq sources and when installing them I didn't get them compiled with mingw64. Precompiled binaries would of course be super cool...

fatal error: zmq.h: No such file or directory

Hello,

I'm trying to use the bindings for the first time. I've made a simple hello world program using zmq4 bindings.
When I run go get github/pebbe/zmq4 I get the following error:

# github.com/pebbe/zmq4
src\github.com\pebbe\zmq4\errors.go:4:17: fatal error: zmq.h: No such file or directory
compilation terminated.

What is the problem with zmq.h?
go version go1.3.2 windows/amd64

Thanks 😄

Allow filter in SetSubscribe and SetUnsubscribe to be of type []byte

The official API defines message filters to be binary data [1], and so it seems more correct to use filter []byte instead of filter string for SetSubscribe and SetUnsubscribe.

For most use cases it's probably convenient to use strings directly, so perhaps it's best to add a couple additional methods which accepts []byte (or a lower level interface)?

My motivation: I'm working on a library where topics are random, fixed-length binary arrays (will probably end up using int64 or UUID). We more or less want to use topics as capabilities [2].

I'm sorry if there's already a way to achieve this (please let me know).

[1] http://api.zeromq.org/4-0:zmq-setsockopt#toc6
[2] http://en.wikipedia.org/wiki/Capability-based_security

Preliminary support for message metadata won't compile for me

After commit b3fd0ce, this won't compile for me.

# github.com/pebbe/zmq4
In file included from zmq4.go:5:
./zmq4.h:7:66: error: control reaches end of non-void function [-Werror,-Wreturn-type]
const char *zmq_msg_gets (zmq_msg_t *msg, const char *property) {}
                                                                 ^
1 error generated.

When I roll back to 60294c2 all is well.

Reactor.AddChannelTime inconvenient

The handler of AddChannelTime takes an interface{}, but the value is guaranteed to be a time.Time. It would be nice to not have to assert the type inside such a handler.

Static linking fails (due to included C source?)

I get these errors when I invoke:

go build --ldflags '-extldflags "-lstdc++ -static -lsodium -static -lzmq"' ./main.go

multiple definition of 'zmq_msg_gets'
github.com/pebbe/zmq4/zmq4.go:31: first defined here

Note that zmq4/zmq4.go:31 is zmq_msg_gets.

How can I statically link this package? I want to distribute a binary without the shared library dependency.

I've been following the directions here for static linking:
http://tschottdorf.github.io/linking-golang-go-statically-cgo-testing/

Config

  • go1.5 linux/amd64
  • Ubuntu 15.04
  • ZeroMQ 4.1.3 built from source

Endpoint doesn't seem to be be released immediately after closing an inproc socket

The following gist has two identical test functions, but when you run it in a loop the second one will eventually (usually after less than a dozen iterations) panic on socket.Bind() with an error saying that the endpoint is still in use. I expect them to pass all the time as the socket.Close() in the first test should release the endpoint immediately.

https://gist.github.com/gsalgado/817bb981d6729e6cd2df

The same doesn't happen if I use IPC as the transport or add a sleep (10ms) after the socket.Close() in the first test, so there's probably a race somewhere?

libzmq.dylib built for unsupported file format

After installing zeromq 4.0.4 and pkg-config-0.28 successfully via homebrew; I am getting the following error while trying to install zmq4t:

go get github.com/pebbe/zmq4

ld: warning: ignoring file /usr/local/Cellar/zeromq/4.0.4/lib/libzmq.dylib, file was built for unsupported file format ( 0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0 ) which is not the architecture being linked (i386): /usr/local/Cellar/zeromq/4.0.4/lib/libzmq.dylib Undefined symbols for architecture i386: "_zmq_bind", referenced from: __cgo_b43dcc4524db_Cfunc_zmq_bind in zmq4.cgo2.o __cgo_b43dcc4524db_C2func_zmq_bind in zmq4.cgo2.o (maybe you meant: __cgo_b43dcc4524db_C2func_zmq_bind, __cgo_b43dcc4524db_Cfunc_zmq_bind ) "_zmq_close", referenced from: __cgo_b43dcc4524db_Cfunc_zmq_close in zmq4.cgo2.o __cgo_b43dcc4524db_C2func_zmq_close in zmq4.cgo2.o (maybe you meant: __cgo_b43dcc4524db_Cfunc_zmq_close, __cgo_b43dcc4524db_C2func_zmq_close ) "_zmq_connect", referenced from: __cgo_b43dcc4524db_Cfunc_zmq_connect in zmq4.cgo2.o __cgo_b43dcc4524db_C2func_zmq_connect in zmq4.cgo2.o (maybe you meant: __cgo_b43dcc4524db_C2func_zmq_connect, __cgo_b43dcc4524db_Cfunc_zmq_connect ) [ PART OMITTED] "_zmq_z85_encode", referenced from: __cgo_b43dcc4524db_Cfunc_zmq_z85_encode in zmq4.cgo2.o (maybe you meant: __cgo_b43dcc4524db_Cfunc_zmq_z85_encode) ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status

Regards
JTE

Can't "go get" due to undefined "getInt" and "getString" in "socketget.go"

Hey,

I just tried getting the source but go get fails with the following message:

src/github.com/pebbe/zmq4/socketget.go:428: undefined: getInt
src/github.com/pebbe/zmq4/socketget.go:441: undefined: getString
src/github.com/pebbe/zmq4/socketget.go:453: undefined: getString
src/github.com/pebbe/zmq4/socketget.go:465: undefined: getInt
src/github.com/pebbe/zmq4/socketget.go:495: undefined: getString

I didn't really have the time to investigate, but I think you are calling "getInt" and "getString" instead of "soc.getInt" "soc.getString" in several places.

Thank you for your work!
Niko

ZMQ error when ZMQ.Poll timeout occurs makes no sense on windows 7

Everything seems to work as expected. I am using dealers, req + reply, push + pull without any issues on windows and linux!

On windows when I am doing a poll that times out I get this error:

An attempt was made to load a program with an incorrect format.

On windows this usually means that the binary you are linking to is of a different format but it makes no sense in this case. for one it works correctly without any seen issues. We are pushing terabytes of data over push pulls without any known issues.

The other odd thing here is it seems to only happen when using a dealer socket. I have not seen this error message using REQ, REP, PUSH or PULL.

It only seems to be an incorrect / annoying message the app seems to work correctly, all my tests pass sending data between a dealer with another dealer.

unexpected fault address

Hi!

I've been using this lib for a while but now for some more complex usage I run into this issue. It's a server that has a DEALER socket that uses the Proxy() function to proxy incoming to a ROUTER socket that has worker REP sockets connected to it, each running in an own goroutine. It all works just fine but for one of my servers I keep getting this error:

unexpected fault address 0x4e49474542
fatal error: fault
[signal 0xb code=0x1 addr=0x4e49474542 pc=0x40162cb]

goroutine 8 [running]:
runtime.gothrow(0x439a760, 0x5)
    /usr/local/Cellar/go/1.4/libexec/src/runtime/panic.go:503 +0x8e fp=0xc2080979a8 sp=0xc208097990
runtime.sigpanic()
    /usr/local/Cellar/go/1.4/libexec/src/runtime/sigpanic_unix.go:29 +0x261 fp=0xc2080979f8 sp=0xc2080979a8
runtime.mallocgc(0x60, 0x42a4140, 0x1, 0x8)
    /usr/local/Cellar/go/1.4/libexec/src/runtime/malloc.go:183 +0x8ab fp=0xc208097aa8 sp=0xc2080979f8
runtime.newarray(0x42a4140, 0x5c, 0x42fade0)
    /usr/local/Cellar/go/1.4/libexec/src/runtime/malloc.go:365 +0xc1 fp=0xc208097ae0 sp=0xc208097aa8
runtime.makeslice(0x4296520, 0x5c, 0x5c, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.4/libexec/src/runtime/slice.go:32 +0x15c fp=0xc208097b28 sp=0xc208097ae0
github.com/pebbe/zmq4.(*Socket).RecvBytes(0xc20803d350, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/gust1n/go/src/github.com/pebbe/zmq4/zmq4.go:662 +0x4cf fp=0xc208097c30 sp=0xc208097b28
git.dynamic-design.se/dynamic-cloud/go-butler/butler%2ev2.func·008(0x1)
    [DEDUCTED]/server.go:114 +0x1a3 fp=0xc208097fd8 sp=0xc208097c30
runtime.goexit()
    /usr/local/Cellar/go/1.4/libexec/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc208097fe0 sp=0xc208097fd8
created by [DEDUCTED].(*Server).Start
    [DEDUCTED]/server.go:229 +0x530

Has anyone run into this before? Maybe there is a simpler pattern to build an asynchonous server with some running workers?

error: interrupted system call

I'm getting really weird behavior using ZMQ and your library. I have a web app that connects to 5 different backing services using 5 different sockers in 5 different contexts. If I put some load on the web app just talking to any of the services the first connection created returns "interrupted system call", (I've check it using zmq.Errno(syscall.EINTR)).

So basically if a connect (create ctx and socket) on order to service 1,2,3,4,5 and then put a lot of load on service 2, service 1 will receive SIGINT and die. If I reverse it to 5,4,3,2,1 and put a lot of load on service 2, service 5 will crash,

There is nothing in my code (or outside) sending a SIGINT. And regardless how much further I load it, all of the other connections stays up, it's just the very first one created.

Has anyone seen anything like this behavior, sorry if it's not specific to your go implementation.

Crashing

My proxy which sends data through zeromq is crashing with the following error under heavy load:

Assertion failed: ok (mailbox.cpp:82)
SIGABRT: abort
PC=0x7fff9509b282
signal arrived during cgo execution

goroutine 33577 [syscall]:
Assertion failed: ok (mailbox.cpp:82)
runtime.cgocall(0x40013d0, 0x8eadde8)
Assertion failed: ok (mailbox.cpp:82)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/cgocall.c:143 +0xe5 fp=0x8eaddc0 sp=0x8eadd78Assertion failed: ok (mailbox.cpp:82)

github.com/pebbe/zmq4._C2func_zmq_send(0x6003e00, 0xc20bf3ec00, 0x3b6, Assertion failed: ok (mailbox.cpp:82)
0xc200000000, 0x41f92c0, 0xc20bf27060, 0xc20bf3ec00)
Assertion failed: ok (mailbox.cpp:82)
    github.com/pebbe/zmq4/_obj/_cgo_defun.c:450 +0x36 fp=0x8eadde8 sp=0x8eaddc0
Assertion failed: ok (mailbox.cpp:82)
github.com/pebbe/zmq4.(*Socket).SendBytes(0xc208024ba0, 0xc20bf3ec00, 0x3b6, 0x400, 0x0, 0x3b6Assertion failed: ok (mailbox.cpp:82)
, 0x0, 0x0)
    /Users/montanaflynn/go/src/github.com/pebbe/zmq4/zmq4.go:716 +0x136Assertion failed: ok (mailbox.cpp:82)
 fp=0x8eade80 sp=0x8eadde8Assertion failed: ok (mailbox.cpp:82)
2015/02/17 22:35:08 GET 200 anonfunction.com
signal: abort trap

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.