本函数返回一个void*类型的句柄,用于引用这个socket,type参数则决定了该socket上消息队列的类型。
新建的socket是未绑定的,要使socket能够通讯,必须调用zmq_connect()与另一个端点建立连接或者调用zmq_bind()使其能够接受来自其它端点的连接。
传统的网络socket代表同步接口,而zmq socket则代表异步消息队列接口。网络socket传输子节流或数据报,zmq socket传输消息。
zmq的异步含义是连接建立和销毁,消息传输的时序都是由zmq自己完成的,与用户无关。如果对方无法接收,则发送端会将消息排序放入队列,而不是丢弃。
传统socket只允许一对一或多对一,但zmq socket允许发起多个连接,也允许多个端点连接自己,从而可以建立多对多的关系。
socket类型是按照消息通讯模式来划分的。
本模式用于一个客户端向某个服务的一个或多个实例发起请求,并接收来自服务器的对每个请求的响应。
ZMQ_REQ socket用于客户端向服务器发送请求和接收来自服务的答复。此套接字类型,只允许一个zmq_send(请求)和随后zmq_recv(答复)的交替调用。如果有多个服务实例,则每个客户端请求发送和多个服务实例之间用轮转调度,每个收到的答复与最近发出的请求匹配。
当ZMQ_REQ socket连接的所有服务实例都进入高水位状态,或者当前没有服务实例可用,那么这个socket就进入异常状态,这个socket上所有的zmq_send()操作将会阻塞(放入队列但是不发送),直到异常状态结束或有可用的服务实例。消息不会被丢弃。
ZMQ_REQ socket特性 | |
---|---|
对方socket类型 | ZMQ_REP |
方向 | 双向 |
发送/接收模式 | Send, Receive, Send, Receive, … |
发送调度策略 | Round-robin |
到达路由策略 | Last peer |
高水位处理 | 阻塞 |
ZMQ_REP
ZMQ_REP socket是服务实例用于从客户端接收请求和向客户端发送响应的。这种socket类型只允许zmq_recv()和zmq_send()交替调用。每个接受到的请求是按照所有客户端内公平原则排队的。每个响应都会发送给最近一个发起请求的客户端。如果原始的请求客户端不存在,那么响应被丢弃。当ZMQ_REP socket由于客户端的高水位原因进入异常状态时,所有发送到客户端的响应都会被丢弃,直到异常结束。
ZMQ_REP socket特性 | |
---|---|
对方socket类型 | ZMQ_REQ |
方向 | 双向 |
发送/接收模式 | Receive, Send, Receive, Send, … |
接收调度策略 | Fair-queued |
发送路由策略 | Last peer |
高水位处理 | 丢弃 |
当所有客户端都进入高水位状态或不存在客户端时,本socket进入异常状态。这时本socket上的任何zmq_send()调用都将阻塞,直到异常情况结束。消息不会丢弃。
When a ZMQ_DEALER socket is connected to a ZMQ_REP socket each message sent must consist of an empty message part, the delimiter, followed by one or more body parts.
当一个ZMQ_DEALER socket连接到一个ZMQ_REP socket时,每个发送的消息都必须由一个空消息,分隔符和一个或多个消息体组成。
ZMQ_DEALER特性 | |
---|---|
对端socket类型 | ZMQ_ROUTER, ZMQ_REQ, ZMQ_REP |
方向 | 双向 |
发送/接收模式 | 不限 |
发送策略 | Round-robin |
接收策略 | Fair-queued |
高水位处理 | 阻塞 |
当一个ZMQ_REQ连接到一个ZMQ_ROUTER socket时,每个收到的消息必须包含发送端的标识和一个分隔符。因此,收到的消息的结构是:一个或多个标识,分隔符,一个或多个消息体。当发送响应给ZMQ_REQ socket时,应用程序必须包含分隔符。
ZMQ_ROUTER特性 | |
---|---|
对端socket | ZMQ_DEALER, ZMQ_REQ, ZMQ_REP |
方向 | 双向 |
发送/接收模式 | 不限 |
发送策略 | See text |
接收策略 | Fair-queued |
高水位处理 | 丢弃 |