开发者社区> 范大脚脚> 正文

ZeroMQ接口函数之 :zmq_sendmsg – 从一个socket上发送一个消息帧

简介:
+关注继续查看

zmq_sendmsg – 从一个socket上发送一个消息帧

Synopsis

int zmq_sendmsg (void *socket, zmq_msg_t *msg, int flags);

Description

zmq_sendmsg()函数会把msg参数指定的消息对象添加到socket参数指定的socket上,等待将其发送。flags参数是由下列flag组合成的。

  ZMQ_DONTWAIT

    此选项适用于当socket没有链接到另一端而使操作进入阻塞模式的socket类型(DEALER,PUSH),指定操作以非阻塞模式执行。当消息无法添加到指定的socket的队列上时,函数zmq_sendmsg()执行失败并设置errno的值为EAGAIN。

  ZMQ_SNDMORE

    指定当前要发送的消息是一个多帧消息的其中以帧,并且此消息后还会有更多的消息帧要进行发送。参见下面关于多帧消息的章节以获取更多信息。

使用zmq_sendmsg()函数发送消息的,被发送的zmq_msg_t结构体是无效的。如果你想要把这个消息发送给多个socket,你需要使用zmq_msg_copy()等函数复制一份。

成功调用了zmq_sendmsg()并不意味着消息已经成功发送到了网络上,只能说明消息已经添加到了socket的消息队列中,并且由ZMQ开始接管这个消息。
这个API已经废弃了,推荐使用zmq_msg_send(3)函数。

Multi-part messages

一个ZMQ消息由1个或多个ZMQ消息帧组成。ZMQ保证自动交付消息:一个ZMQ的消息要么所有的消息帧都被接收,要么一个都不会接收。一个消息中消息帧的总数没有限制,除非内存不够用。

当应用程序在发送多帧消息的时候,出了最后一次发送消息帧,每一次都要使用ZMQ_SNDMORE参数。

Return value

如果zmq_sendmsg()函数执行成功返回发送的消息字节数。否则返回 -1, 并且设置errno的值为下列定义的值。

Errors

  EAGAIN

    使用非阻塞模式进行操作,并且当前这个消息不可用。

  ENOTSUP

    socket类型不支持zmq_sendmsg()函数的操作。

  EFSM

    由于socket当前处于不适当的状态,导致zmq_sendmsg()函数的操作无法进行。这个错误可能出现在经常在几种状态间进行切换的socket类型上,比如ZMQ_REP。参见zmq_socket(3)函数中的消息模式章节以获取更多信息。

  ETERM

    与socket相联系的context被终结了。

  ENOTSOCK

    参数提供的socket不可用。

  EINTR

    此次操作在消息发送之前被系统信号中断了。

  EFAULT

    参数提供的消息不可用。

  EHOSTUNREACH

    这个消息无法被路由。

Example

  创建一个消息并发送出去

复制代码
/* Create a new message, allocating 6 bytes for message content */
zmq_msg_t msg;
int rc = zmq_msg_init_size (&msg, 6); 
assert (rc == 0); 
/* Fill in message content with 'AAAAAA' */
memset (zmq_msg_data (&msg), 'A', 6); 
/* Send the message to the socket */
rc = zmq_sendmsg (socket, &msg, 0); 
assert (rc == 6);
复制代码

  发送一个多帧消息

复制代码
/* Send a multi-part message consisting of three parts to socket */
rc = zmq_sendmsg (socket, &part1, ZMQ_SNDMORE);
rc = zmq_sendmsg (socket, &part2, ZMQ_SNDMORE);
/* Final part; no more parts to follow */
rc = zmq_sendmsg (socket, &part3, 0);
复制代码

See also

zmq_recv(3)  zmq_socket(7)  zmq(7)

Authors

This page was written by the ØMQ community. To make a change please read the ØMQ Contribution Policy at http://www.zeromq.org/docs:contributing.

Web site design and content is copyright (c) 2007-2012 iMatix Corporation. Contact us for professional support. Site content licensed under the Creative Commons Attribution-Share Alike 3.0 License. ØMQ is copyright (c) Copyright (c) 2007-2012 iMatix Corporation and Contributors. ØMQ is free software licensed under the LGPL. ØMQ, ZeroMQ, and 0MQ are trademarks of iMatix Corporation. Terms of Use — Privacy

Policy



本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4290443.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
开发函数计算的正确姿势——运行 Selenium Java
Selenium 是用于测试 Web 应用程序的可移植框架。本文介绍如何将 Selenium 框架运行在函数计算的 Java 运行时。
913 0
RocketMQ系列(六)批量发送与过滤
今天我们再来看看RocketMQ的另外两个小功能,消息的批量发送和过滤。这两个小功能提升了我们使用RocketMQ的效率。
675 0
【COM原理和应用】2、COM对象和接口
1、COM对象 在客户程序与组件交互的过程中,COM组件将以COM对象形式封装的实体提供给客户程序。与C++等面向对象语言中类的概念类似,COM对象也包含其成员属性和成员方法,前者反应COM对象的状态,后者是对象提供给外界的接口。
1204 0
xcode反汇编调试iOS模拟器程序(五)调试objc_msgSend函数
反汇编调试objective-c,遇到最多的就是objc_msgSend这函数了,本节主要讲讲它的实现以及调试过程的一些技巧。 以UIWebView为例子,看看它在loadRequest时做了什么。
1115 0
Ajax-17:使用fetch函数发送ajax请求
Ajax-17:使用fetch函数发送ajax请求
233 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载