Beispiel #1
0
// 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
}
Beispiel #2
0
// 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
}