// Sends a single message part. The `more` flag is used to specify whether this is the last part of the message (false), // or if there are more parts to follow (true). SendPart is fairly low-level, and usually Send will be the preferred // method to use. func (s *Socket) SendPart(part []byte, more bool) (err error) { for { err = nil var msg C.zmq_msg_t toMsg(&msg, part) flags := C.int(0) if more { flags = C.ZMQ_SNDMORE } r := C.zmq_msg_send(&msg, s.sock, flags) if r == -1 { err = zmqerr() } C.zmq_msg_close(&msg) if err != ErrInterrupted { break } } return }
// Send a message to the socket. // int zmq_send (void *s, zmq_msg_t *msg, int flags); func (s *zmqSocket) Send(data []byte, flags SendRecvOption) error { var m C.zmq_msg_t // Copy data array into C-allocated buffer. size := C.size_t(len(data)) if C.zmq_msg_init_size(&m, size) != 0 { return errno() } if size > 0 { // FIXME Ideally this wouldn't require a copy. C.memcpy(unsafe.Pointer(C.zmq_msg_data(&m)), unsafe.Pointer(&data[0]), size) // XXX I hope this works...(seems to) } if C.zmq_msg_send(&m, s.s, C.int(flags)) == -1 { // zmq_send did not take ownership, free message C.zmq_msg_close(&m) return errno() } return nil }