mirror of
https://github.com/zeromq/libzmq.git
synced 2025-01-14 01:37:56 +08:00
Simplified zmq_msg_get/set functions
* Return integer property * Fixed up man pages, which were inaccurate * Fixed test case
This commit is contained in:
parent
6dd102cded
commit
f26e4ab784
1
.gitignore
vendored
1
.gitignore
vendored
@ -20,6 +20,7 @@ autom4te.cache
|
||||
.*
|
||||
*~
|
||||
.*~
|
||||
tests/test_last_endpoint
|
||||
tests/test_pair_inproc
|
||||
tests/test_pair_ipc
|
||||
tests/test_pair_tcp
|
||||
|
@ -4,28 +4,24 @@ zmq_msg_get(3)
|
||||
|
||||
NAME
|
||||
----
|
||||
zmq_msg_get - get message options
|
||||
zmq_msg_get - get message property
|
||||
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
*int zmq_msg_get (zmq_msg_t '*message', int 'option_name', void '*option_value', size_t '*option_len');*
|
||||
*int zmq_msg_get (zmq_msg_t '*message', int 'property');*
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _zmq_msg_get()_ function shall retrieve the value for the option
|
||||
specified by the 'option_name' argument for the message pointed to by the
|
||||
'message' argument, and store it in the buffer pointed to by the 'option_value'
|
||||
argument. The 'option_len' argument is the size in bytes of the buffer pointed
|
||||
to by 'option_value'; upon successful completion _zmq_getsockopt()_ shall
|
||||
modify the 'option_len' argument to indicate the actual size of the option
|
||||
value stored in the buffer.
|
||||
The _zmq_msg_get()_ function shall return the value for the property
|
||||
specified by the 'property' argument for the message pointed to by the
|
||||
'message' argument.
|
||||
|
||||
The following options can be retrieved with the _zmq_msg_get()_ function:
|
||||
The following properties can be retrieved with the _zmq_msg_get()_ function:
|
||||
|
||||
*ZMQ_MORE*::
|
||||
Indicates that there are more message parts to follow after the 'message'.
|
||||
Indicates that there are more message frames to follow after the 'message'.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
@ -36,42 +32,34 @@ shall return `-1` and set 'errno' to one of the values defined below.
|
||||
ERRORS
|
||||
------
|
||||
*EINVAL*::
|
||||
The requested option _option_name_ is unknown, or the requested _option_size_ or
|
||||
_option_value_ is invalid, or the size of the buffer pointed to by
|
||||
_option_value_, as specified by _option_len_, is insufficient for storing the
|
||||
option value.
|
||||
The requested _property_ is unknown.
|
||||
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
.Receiving a multi-part message
|
||||
.Receiving a multi-frame message
|
||||
----
|
||||
zmq_msg_t part;
|
||||
int more;
|
||||
size_t more_size = sizeof (more);
|
||||
while (true) {
|
||||
// Create an empty 0MQ message to hold the message part
|
||||
int rc = zmq_msg_init (&part);
|
||||
// Create an empty 0MQ message to hold the message frame
|
||||
int rc = zmq_msg_init (&frame);
|
||||
assert (rc == 0);
|
||||
// Block until a message is available to be received from socket
|
||||
rc = zmq_recvmsg (socket, &part, 0);
|
||||
rc = zmq_recvmsg (socket, &frame, 0);
|
||||
assert (rc != -1);
|
||||
rc = getmsgopt (&part, ZMQ_MORE, &more, &more_size);
|
||||
assert (rc == 0);
|
||||
if (more)
|
||||
if (zmq_msg_get (&frame, ZMQ_MORE))
|
||||
fprintf (stderr, "more\n");
|
||||
else {
|
||||
fprintf (stderr, "end\n");
|
||||
break;
|
||||
}
|
||||
zmq_msg_close (part);
|
||||
zmq_msg_close (frame);
|
||||
}
|
||||
----
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkzmq:zmq_msg_poke[3]
|
||||
linkzmq:zmq_msg_set[3]
|
||||
linkzmq:zmq_msg_init[3]
|
||||
linkzmq:zmq_msg_close[3]
|
||||
linkzmq:zmq[7]
|
||||
|
@ -50,8 +50,8 @@ while (true) {
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkzmq:zmq_msg_peek[3]
|
||||
linkzmq:zmq_msg_poke[3]
|
||||
linkzmq:zmq_msg_get[3]
|
||||
linkzmq:zmq_msg_set[3]
|
||||
linkzmq:zmq_msg_init[3]
|
||||
linkzmq:zmq_msg_close[3]
|
||||
linkzmq:zmq[7]
|
||||
|
@ -5,22 +5,21 @@ zmq_msg_set(3)
|
||||
NAME
|
||||
----
|
||||
|
||||
zmq_msg_set - set message options
|
||||
zmq_msg_set - set message property
|
||||
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
*int zmq_msg_peek (zmq_msg_t '*message', int 'option_name', const void '*option_value', size_t '*option_len');*
|
||||
*int zmq_msg_set (zmq_msg_t '*message', int 'property', int 'value');*
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _zmq_msg_set()_ function shall set the option specified by the
|
||||
'option_name' argument to the value pointed to by the 'option_value' argument
|
||||
for the 0MQ socket pointed to by the 'socket' argument. The 'option_len'
|
||||
argument is the size of the option value in bytes.
|
||||
The _zmq_msg_set()_ function shall set the property specified by the
|
||||
'property' argument to the value of the 'value' argument for the 0MQ
|
||||
message fragment pointed to by the 'message' argument.
|
||||
|
||||
Currently the _zmq_msg_set()_ function does not support any option names.
|
||||
Currently the _zmq_msg_set()_ function does not support any property names.
|
||||
|
||||
|
||||
RETURN VALUE
|
||||
@ -32,13 +31,12 @@ shall return `-1` and set 'errno' to one of the values defined below.
|
||||
ERRORS
|
||||
------
|
||||
*EINVAL*::
|
||||
The requested option _option_name_ is unknown, or the requested _option_len_ or
|
||||
_option_value_ is invalid.
|
||||
The requested property _property_ is unknown.
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkzmq:zmq_msg_peek[3]
|
||||
linkzmq:zmq_msg_get[3]
|
||||
linkzmq:zmq[7]
|
||||
|
||||
|
||||
|
@ -168,10 +168,9 @@ ZMQ_EXPORT int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src);
|
||||
ZMQ_EXPORT void *zmq_msg_data (zmq_msg_t *msg);
|
||||
ZMQ_EXPORT size_t zmq_msg_size (zmq_msg_t *msg);
|
||||
ZMQ_EXPORT int zmq_msg_more (zmq_msg_t *msg);
|
||||
ZMQ_EXPORT int zmq_msg_get (zmq_msg_t *msg, int option, void *optval,
|
||||
size_t *optvallen);
|
||||
ZMQ_EXPORT int zmq_msg_set (zmq_msg_t *msg, int option, const void *optval,
|
||||
size_t *optvallen);
|
||||
ZMQ_EXPORT int zmq_msg_get (zmq_msg_t *msg, int option);
|
||||
ZMQ_EXPORT int zmq_msg_set (zmq_msg_t *msg, int option, int optval);
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* 0MQ socket definition. */
|
||||
|
21
src/zmq.cpp
21
src/zmq.cpp
@ -549,34 +549,21 @@ size_t zmq_msg_size (zmq_msg_t *msg_)
|
||||
|
||||
int zmq_msg_more (zmq_msg_t *msg_)
|
||||
{
|
||||
int more;
|
||||
size_t more_size = sizeof (more);
|
||||
int rc = zmq_msg_get (msg_, ZMQ_MORE, &more, &more_size);
|
||||
assert (rc == 0);
|
||||
return more;
|
||||
return zmq_msg_get (msg_, ZMQ_MORE);
|
||||
}
|
||||
|
||||
int zmq_msg_get (zmq_msg_t *msg_, int option_, void *optval_,
|
||||
size_t *optvallen_)
|
||||
int zmq_msg_get (zmq_msg_t *msg_, int option_)
|
||||
{
|
||||
switch (option_) {
|
||||
case ZMQ_MORE:
|
||||
if (*optvallen_ < sizeof (int)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
*((int*) optval_) =
|
||||
(((zmq::msg_t*) msg_)->flags () & zmq::msg_t::more)? 1 : 0;
|
||||
*optvallen_ = sizeof (int);
|
||||
return 0;
|
||||
return (((zmq::msg_t*) msg_)->flags () & zmq::msg_t::more)? 1: 0;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int zmq_msg_set (zmq_msg_t *msg_, int option_, const void *optval_,
|
||||
size_t *optvallen_)
|
||||
int zmq_msg_set (zmq_msg_t *msg_, int option_, int optval_)
|
||||
{
|
||||
// No options supported at present
|
||||
errno = EINVAL;
|
||||
|
@ -1,225 +0,0 @@
|
||||
#! /bin/bash
|
||||
|
||||
# test_last_endpoint - temporary wrapper script for .libs/test_last_endpoint
|
||||
# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2ubuntu1
|
||||
#
|
||||
# The test_last_endpoint program cannot be directly executed until all the libtool
|
||||
# libraries that it depends on are installed.
|
||||
#
|
||||
# This wrapper script should never be moved out of the build directory.
|
||||
# If it is, it will not operate correctly.
|
||||
|
||||
# Sed substitution that helps us do robust quoting. It backslashifies
|
||||
# metacharacters that are still active within double-quoted strings.
|
||||
sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
|
||||
|
||||
# Be Bourne compatible
|
||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
||||
emulate sh
|
||||
NULLCMD=:
|
||||
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
|
||||
# is contrary to our usage. Disable this feature.
|
||||
alias -g '${1+"$@"}'='"$@"'
|
||||
setopt NO_GLOB_SUBST
|
||||
else
|
||||
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
|
||||
fi
|
||||
BIN_SH=xpg4; export BIN_SH # for Tru64
|
||||
DUALCASE=1; export DUALCASE # for MKS sh
|
||||
|
||||
# The HP-UX ksh and POSIX shell print the target directory to stdout
|
||||
# if CDPATH is set.
|
||||
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
|
||||
|
||||
relink_command="(cd /home/ph/work/libzmq_pieterh/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH; PATH=/opt/android-toolchain/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games; export PATH; g++ -g -O2 -o \$progdir/\$file test_last_endpoint.o ../src/.libs/libzmq.so -lrt -lpthread -Wl,-rpath -Wl,/home/ph/work/libzmq_pieterh/src/.libs)"
|
||||
|
||||
# This environment variable determines our operation mode.
|
||||
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
|
||||
# install mode needs the following variables:
|
||||
generated_by_libtool_version='2.4'
|
||||
notinst_deplibs=' ../src/libzmq.la'
|
||||
else
|
||||
# When we are sourced in execute mode, $file and $ECHO are already set.
|
||||
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
|
||||
file="$0"
|
||||
|
||||
# A function that is used when there is no print builtin or printf.
|
||||
func_fallback_echo ()
|
||||
{
|
||||
eval 'cat <<_LTECHO_EOF
|
||||
$1
|
||||
_LTECHO_EOF'
|
||||
}
|
||||
ECHO="printf %s\\n"
|
||||
fi
|
||||
|
||||
# Very basic option parsing. These options are (a) specific to
|
||||
# the libtool wrapper, (b) are identical between the wrapper
|
||||
# /script/ and the wrapper /executable/ which is used only on
|
||||
# windows platforms, and (c) all begin with the string --lt-
|
||||
# (application programs are unlikely to have options which match
|
||||
# this pattern).
|
||||
#
|
||||
# There are only two supported options: --lt-debug and
|
||||
# --lt-dump-script. There is, deliberately, no --lt-help.
|
||||
#
|
||||
# The first argument to this parsing function should be the
|
||||
# script's ../libtool value, followed by no.
|
||||
lt_option_debug=
|
||||
func_parse_lt_options ()
|
||||
{
|
||||
lt_script_arg0=$0
|
||||
shift
|
||||
for lt_opt
|
||||
do
|
||||
case "$lt_opt" in
|
||||
--lt-debug) lt_option_debug=1 ;;
|
||||
--lt-dump-script)
|
||||
lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
|
||||
test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
|
||||
lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
|
||||
cat "$lt_dump_D/$lt_dump_F"
|
||||
exit 0
|
||||
;;
|
||||
--lt-*)
|
||||
$ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Print the debug banner immediately:
|
||||
if test -n "$lt_option_debug"; then
|
||||
echo "test_last_endpoint:test_last_endpoint:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-2ubuntu1" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# Used when --lt-debug. Prints its arguments to stdout
|
||||
# (redirection is the responsibility of the caller)
|
||||
func_lt_dump_args ()
|
||||
{
|
||||
lt_dump_args_N=1;
|
||||
for lt_arg
|
||||
do
|
||||
$ECHO "test_last_endpoint:test_last_endpoint:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
|
||||
lt_dump_args_N=`expr $lt_dump_args_N + 1`
|
||||
done
|
||||
}
|
||||
|
||||
# Core function for launching the target application
|
||||
func_exec_program_core ()
|
||||
{
|
||||
|
||||
if test -n "$lt_option_debug"; then
|
||||
$ECHO "test_last_endpoint:test_last_endpoint:${LINENO}: newargv[0]: $progdir/$program" 1>&2
|
||||
func_lt_dump_args ${1+"$@"} 1>&2
|
||||
fi
|
||||
exec "$progdir/$program" ${1+"$@"}
|
||||
|
||||
$ECHO "$0: cannot exec $program $*" 1>&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# A function to encapsulate launching the target application
|
||||
# Strips options in the --lt-* namespace from $@ and
|
||||
# launches target application with the remaining arguments.
|
||||
func_exec_program ()
|
||||
{
|
||||
for lt_wr_arg
|
||||
do
|
||||
case $lt_wr_arg in
|
||||
--lt-*) ;;
|
||||
*) set x "$@" "$lt_wr_arg"; shift;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
func_exec_program_core ${1+"$@"}
|
||||
}
|
||||
|
||||
# Parse options
|
||||
func_parse_lt_options "$0" ${1+"$@"}
|
||||
|
||||
# Find the directory that this script lives in.
|
||||
thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
|
||||
test "x$thisdir" = "x$file" && thisdir=.
|
||||
|
||||
# Follow symbolic links until we get to the real thisdir.
|
||||
file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
|
||||
while test -n "$file"; do
|
||||
destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
|
||||
|
||||
# If there was a directory component, then change thisdir.
|
||||
if test "x$destdir" != "x$file"; then
|
||||
case "$destdir" in
|
||||
[\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
|
||||
*) thisdir="$thisdir/$destdir" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
|
||||
file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
|
||||
done
|
||||
|
||||
# Usually 'no', except on cygwin/mingw when embedded into
|
||||
# the cwrapper.
|
||||
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
|
||||
if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
|
||||
# special case for '.'
|
||||
if test "$thisdir" = "."; then
|
||||
thisdir=`pwd`
|
||||
fi
|
||||
# remove .libs from thisdir
|
||||
case "$thisdir" in
|
||||
*[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
|
||||
.libs ) thisdir=. ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Try to get the absolute directory name.
|
||||
absdir=`cd "$thisdir" && pwd`
|
||||
test -n "$absdir" && thisdir="$absdir"
|
||||
|
||||
program=lt-'test_last_endpoint'
|
||||
progdir="$thisdir/.libs"
|
||||
|
||||
if test ! -f "$progdir/$program" ||
|
||||
{ file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
|
||||
test "X$file" != "X$progdir/$program"; }; then
|
||||
|
||||
file="$$-$program"
|
||||
|
||||
if test ! -d "$progdir"; then
|
||||
mkdir "$progdir"
|
||||
else
|
||||
rm -f "$progdir/$file"
|
||||
fi
|
||||
|
||||
# relink executable if necessary
|
||||
if test -n "$relink_command"; then
|
||||
if relink_command_output=`eval $relink_command 2>&1`; then :
|
||||
else
|
||||
printf %s\n "$relink_command_output" >&2
|
||||
rm -f "$progdir/$file"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
|
||||
{ rm -f "$progdir/$program";
|
||||
mv -f "$progdir/$file" "$progdir/$program"; }
|
||||
rm -f "$progdir/$file"
|
||||
fi
|
||||
|
||||
if test -f "$progdir/$program"; then
|
||||
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
|
||||
# Run the actual program with our arguments.
|
||||
func_exec_program ${1+"$@"}
|
||||
fi
|
||||
else
|
||||
# The program doesn't exist.
|
||||
$ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
|
||||
$ECHO "This script is just a wrapper for $program." 1>&2
|
||||
$ECHO "See the libtool documentation for more information." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
@ -50,26 +50,19 @@ int main (int argc, char *argv [])
|
||||
assert (rc == 0);
|
||||
rc = zmq_recvmsg (sb, &msg, 0);
|
||||
assert (rc >= 0);
|
||||
int more;
|
||||
size_t more_size = sizeof (more);
|
||||
rc = zmq_msg_get (&msg, ZMQ_MORE, &more, &more_size);
|
||||
assert (rc == 0);
|
||||
int more = zmq_msg_get (&msg, ZMQ_MORE);
|
||||
assert (more == 1);
|
||||
|
||||
// Then the first part of the message body.
|
||||
rc = zmq_recvmsg (sb, &msg, 0);
|
||||
assert (rc == 1);
|
||||
more_size = sizeof (more);
|
||||
rc = zmq_msg_get (&msg, ZMQ_MORE, &more, &more_size);
|
||||
assert (rc == 0);
|
||||
more = zmq_msg_get (&msg, ZMQ_MORE);
|
||||
assert (more == 1);
|
||||
|
||||
// And finally, the second part of the message body.
|
||||
rc = zmq_recvmsg (sb, &msg, 0);
|
||||
assert (rc == 1);
|
||||
more_size = sizeof (more);
|
||||
rc = zmq_msg_get (&msg, ZMQ_MORE, &more, &more_size);
|
||||
assert (rc == 0);
|
||||
more = zmq_msg_get (&msg, ZMQ_MORE);
|
||||
assert (more == 0);
|
||||
|
||||
// Deallocate the infrastructure.
|
||||
|
Loading…
x
Reference in New Issue
Block a user