zmq.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. {
  2. Copyright (c) 2012 Varga Balázs (bb.varga@gmail.com)
  3. This file is part of 0MQ Delphi binding
  4. 0MQ Delphi binding is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public License as
  6. published by the Free Software Foundation; either version 3 of the
  7. License, or (at your option) any later version.
  8. 0MQ Delphi binding is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. }
  15. unit zmq;
  16. {$ifdef UNIX}
  17. {$linklib pthread}
  18. {$endif}
  19. {$I zmq.inc}
  20. interface
  21. {$ifdef FPC}
  22. uses
  23. ctypes;
  24. {$endif}
  25. const
  26. {$ifdef UNIX}
  27. libzmq = 'libzmq.so';
  28. {$else}
  29. libzmq = 'libzmq.dll';
  30. {$endif}
  31. { Run-time API version detection }
  32. procedure zmq_version( var major, minor, patch: Integer ); cdecl; external libzmq;
  33. {******************************************************************************}
  34. {* 0MQ errors. *}
  35. {******************************************************************************}
  36. {* A number random enough not to collide with different errno ranges on *}
  37. {* different OSes. The assumption is that error_t is at least 32-bit type. *}
  38. const
  39. ZMQ_HAUSNUMERO = 156384712;
  40. {* On Windows platform some of the standard POSIX errnos are not defined. *}
  41. ENOTSUP = (ZMQ_HAUSNUMERO + 1);
  42. EPROTONOSUPPORT = (ZMQ_HAUSNUMERO + 2);
  43. ENOBUFS = (ZMQ_HAUSNUMERO + 3);
  44. ENETDOWN = (ZMQ_HAUSNUMERO + 4);
  45. EADDRINUSE = (ZMQ_HAUSNUMERO + 5);
  46. EADDRNOTAVAIL = (ZMQ_HAUSNUMERO + 6);
  47. ECONNREFUSED = (ZMQ_HAUSNUMERO + 7);
  48. EINPROGRESS = (ZMQ_HAUSNUMERO + 8);
  49. ENOTSOCK = (ZMQ_HAUSNUMERO + 9);
  50. EMSGSIZE = (ZMQ_HAUSNUMERO + 10);
  51. EAFNOSUPPORT = (ZMQ_HAUSNUMERO + 11);
  52. ENETUNREACH = (ZMQ_HAUSNUMERO + 12);
  53. ECONNABORTED = (ZMQ_HAUSNUMERO + 13);
  54. ECONNRESET = (ZMQ_HAUSNUMERO + 14);
  55. ENOTCONN = (ZMQ_HAUSNUMERO + 15);
  56. ETIMEDOUT = (ZMQ_HAUSNUMERO + 16);
  57. EHOSTUNREACH = (ZMQ_HAUSNUMERO + 17);
  58. ENETRESET = (ZMQ_HAUSNUMERO + 18);
  59. {* Native 0MQ error codes. *}
  60. EFSM = (ZMQ_HAUSNUMERO + 51);
  61. ENOCOMPATPROTO = (ZMQ_HAUSNUMERO + 52);
  62. ETERM = (ZMQ_HAUSNUMERO + 53);
  63. EMTHREAD = (ZMQ_HAUSNUMERO + 54);
  64. {* This function retrieves the errno as it is known to 0MQ library. The goal *}
  65. {* of this function is to make the code 100% portable, including where 0MQ *}
  66. {* compiled with certain CRT library (on Windows) is linked to an *}
  67. {* application that uses different CRT library. *}
  68. function zmq_errno: Integer; cdecl; external libzmq;
  69. {* Resolves system errors and 0MQ errors to human-readable string. *}
  70. function zmq_strerror(errnum: Integer):PAnsiChar; cdecl; external libzmq;
  71. {******************************************************************************}
  72. {* 0MQ infrastructure (a.k.a. context) initialisation & termination. *}
  73. {******************************************************************************}
  74. {$ifdef zmq3}
  75. {* New API *}
  76. {* Context options *}
  77. const
  78. ZMQ_IO_THREADS = 1;
  79. ZMQ_MAX_SOCKETS = 2;
  80. {* Default for new contexts *}
  81. ZMQ_IO_THREADS_DFLT = 1;
  82. ZMQ_MAX_SOCKETS_DFLT = 1024;
  83. function zmq_ctx_new: Pointer; cdecl; external libzmq;
  84. function zmq_ctx_destroy( context: Pointer ): Integer; cdecl; external libzmq;
  85. function zmq_ctx_set( context: Pointer; option: Integer; optval: Integer ): Integer; cdecl; external libzmq;
  86. function zmq_ctx_get( context: Pointer; option: Integer ): Integer; cdecl; external libzmq;
  87. {$endif}
  88. {* Old (legacy) API *}
  89. function zmq_init(io_threads: Integer): Pointer; cdecl; external libzmq;
  90. function zmq_term(context: Pointer): Integer; cdecl; external libzmq;
  91. {******************************************************************************}
  92. {* 0MQ message definition. *}
  93. {******************************************************************************}
  94. {$ifdef zmq3}
  95. type
  96. zmq_msg_t = record
  97. _: Array[0..32-1] of Byte;
  98. end;
  99. {$else}
  100. {* Maximal size of "Very Small Message". VSMs are passed by value *}
  101. {* to avoid excessive memory allocation/deallocation. *}
  102. {* If VMSs larger than 255 bytes are required, type of 'vsm_size' *}
  103. {* field in zmq_msg_t structure should be modified accordingly. *}
  104. const
  105. ZMQ_MAX_VSM_SIZE = 30;
  106. {* Message types. These integers may be stored in 'content' member of the *}
  107. {* message instead of regular pointer to the data. *}
  108. ZMQ_DELIMITER = 31;
  109. ZMQ_VSM = 32;
  110. {* Message flags. ZMQ_MSG_SHARED is strictly speaking not a message flag *}
  111. {* (it has no equivalent in the wire format), however, making it a flag *}
  112. {* allows us to pack the stucture tigher and thus improve performance. *}
  113. ZMQ_MSG_MORE = 1;
  114. ZMQ_MSG_SHARED = 128;
  115. ZMQ_MSG_MASK = 129; {* Merges all the flags *}
  116. {* A message. Note that 'content' is not a pointer to the raw data. *}
  117. {* Rather it is pointer to zmq::msg_content_t structure *}
  118. {* (see src/msg_content.hpp for its definition). *}
  119. type
  120. zmq_msg_t = record
  121. content: Pointer;
  122. flags: Byte;
  123. vsm_size: Byte;
  124. vsm_data: Array[0..ZMQ_MAX_VSM_SIZE-1] of Byte;
  125. end;
  126. {$endif}
  127. free_fn = procedure(data, hint: Pointer);
  128. {$ifdef FPC}
  129. size_t = clong;
  130. {$else}
  131. size_t = Cardinal;
  132. {$endif}
  133. function zmq_msg_init( var msg: zmq_msg_t ): Integer; cdecl; external libzmq;
  134. function zmq_msg_init_size( var msg: zmq_msg_t; size: size_t ): Integer; cdecl; external libzmq;
  135. function zmq_msg_init_data( var msg: zmq_msg_t; data: Pointer; size: size_t;
  136. ffn: free_fn; hint: Pointer ): Integer; cdecl; external libzmq;
  137. function zmq_msg_close(var msg: zmq_msg_t): Integer; cdecl; external libzmq;
  138. function zmq_msg_move(dest, src: zmq_msg_t): Integer; cdecl; external libzmq;
  139. function zmq_msg_copy(dest, src: zmq_msg_t): Integer; cdecl; external libzmq;
  140. function zmq_msg_data(var msg: zmq_msg_t): Pointer; cdecl; external libzmq;
  141. function zmq_msg_size(var msg: zmq_msg_t): size_t; cdecl; external libzmq;
  142. {$ifdef zmq3}
  143. function zmq_msg_more (var msg: zmq_msg_t): Integer; cdecl; external libzmq;
  144. function zmq_msg_get (var msg: zmq_msg_t; option: Integer): Integer; cdecl; external libzmq;
  145. function zmq_msg_set (var msg: zmq_msg_t; option: Integer; optval: Integer): Integer; cdecl; external libzmq;
  146. function zmq_msg_send (var msg: zmq_msg_t; s: Pointer; flags: Integer): Integer; cdecl; external libzmq;
  147. function zmq_msg_recv (var msg: zmq_msg_t; s: Pointer; flags: Integer): Integer; cdecl; external libzmq;
  148. {$endif}
  149. {******************************************************************************}
  150. {* 0MQ socket definition. *}
  151. {******************************************************************************}
  152. {* Socket types. *}
  153. const
  154. ZMQ_PAIR = 0;
  155. ZMQ_PUB = 1;
  156. ZMQ_SUB = 2;
  157. ZMQ_REQ = 3;
  158. ZMQ_REP = 4;
  159. ZMQ_DEALER = 5;
  160. ZMQ_ROUTER = 6;
  161. ZMQ_PULL = 7;
  162. ZMQ_PUSH = 8;
  163. ZMQ_XPUB = 9;
  164. ZMQ_XSUB = 10;
  165. ZMQ_XREQ = ZMQ_DEALER; {* Old alias, remove in 3.x *}
  166. ZMQ_XREP = ZMQ_ROUTER; {* Old alias, remove in 3.x *}
  167. {$ifndef zmq3}
  168. ZMQ_UPSTREAM = ZMQ_PULL; {* Old alias, remove in 3.x *}
  169. ZMQ_DOWNSTREAM = ZMQ_PUSH; {* Old alias, remove in 3.x *}
  170. {$endif}
  171. {* Socket options. *}
  172. {$ifndef zmq3}
  173. ZMQ_HWM = 1;
  174. ZMQ_SWAP = 3;
  175. {$endif}
  176. ZMQ_AFFINITY = 4;
  177. ZMQ_IDENTITY = 5;
  178. ZMQ_SUBSCRIBE = 6;
  179. ZMQ_UNSUBSCRIBE = 7;
  180. ZMQ_RATE = 8;
  181. ZMQ_RECOVERY_IVL = 9;
  182. {$ifndef zmq3}
  183. ZMQ_MCAST_LOOP = 10;
  184. {$endif}
  185. ZMQ_SNDBUF = 11;
  186. ZMQ_RCVBUF = 12;
  187. ZMQ_RCVMORE = 13;
  188. ZMQ_FD = 14;
  189. ZMQ_EVENTS = 15;
  190. ZMQ_TYPE = 16;
  191. ZMQ_LINGER = 17;
  192. ZMQ_RECONNECT_IVL = 18;
  193. ZMQ_BACKLOG = 19;
  194. {$ifndef zmq3}
  195. ZMQ_RECOVERY_IVL_MSEC = 20; {* opt. recovery time, reconcile in 3.x *}
  196. {$endif}
  197. ZMQ_RECONNECT_IVL_MAX = 21;
  198. {$ifdef zmq3}
  199. ZMQ_MAXMSGSIZE = 22;
  200. ZMQ_SNDHWM = 23;
  201. ZMQ_RCVHWM = 24;
  202. ZMQ_MULTICAST_HOPS = 25;
  203. {$endif}
  204. ZMQ_RCVTIMEO = 27;
  205. ZMQ_SNDTIMEO = 28;
  206. {$ifdef zmq3}
  207. ZMQ_IPV4ONLY = 31;
  208. ZMQ_LAST_ENDPOINT = 32;
  209. ZMQ_ROUTER_MANDATORY = 33;
  210. ZMQ_TCP_KEEPALIVE = 34;
  211. ZMQ_TCP_KEEPALIVE_CNT = 35;
  212. ZMQ_TCP_KEEPALIVE_IDLE = 36;
  213. ZMQ_TCP_KEEPALIVE_INTVL = 37;
  214. ZMQ_TCP_ACCEPT_FILTER = 38;
  215. ZMQ_DELAY_ATTACH_ON_CONNECT = 39;
  216. ZMQ_XPUB_VERBOSE = 40;
  217. {* Message options *}
  218. ZMQ_MORE = 1;
  219. {$endif}
  220. {* Send/recv options. *}
  221. {$ifdef zmq3}
  222. ZMQ_DONTWAIT = 1;
  223. {$else}
  224. ZMQ_NOBLOCK = 1;
  225. {$endif}
  226. ZMQ_SNDMORE = 2;
  227. {$ifdef zmq3}
  228. {******************************************************************************}
  229. {* 0MQ socket events and monitoring *}
  230. {******************************************************************************}
  231. {* Socket transport events (tcp and ipc only) *}
  232. ZMQ_EVENT_CONNECTED = 1;
  233. ZMQ_EVENT_CONNECT_DELAYED = 2;
  234. ZMQ_EVENT_CONNECT_RETRIED = 4;
  235. ZMQ_EVENT_LISTENING = 8;
  236. ZMQ_EVENT_BIND_FAILED = 16;
  237. ZMQ_EVENT_ACCEPTED = 32;
  238. ZMQ_EVENT_ACCEPT_FAILED = 64;
  239. ZMQ_EVENT_CLOSED = 128;
  240. ZMQ_EVENT_CLOSE_FAILED = 256;
  241. ZMQ_EVENT_DISCONNECTED =512;
  242. ZMQ_EVENT_ALL =
  243. ZMQ_EVENT_CONNECTED or
  244. ZMQ_EVENT_CONNECT_DELAYED or
  245. ZMQ_EVENT_CONNECT_RETRIED or
  246. ZMQ_EVENT_LISTENING or
  247. ZMQ_EVENT_BIND_FAILED or
  248. ZMQ_EVENT_ACCEPTED or
  249. ZMQ_EVENT_ACCEPT_FAILED or
  250. ZMQ_EVENT_CLOSED or
  251. ZMQ_EVENT_CLOSE_FAILED or
  252. ZMQ_EVENT_DISCONNECTED;
  253. {* Socket event data (union member per event) *}
  254. type
  255. zmq_event_t = record
  256. event: Integer;
  257. addr: PAnsiChar;
  258. case Integer of
  259. 0, // connected
  260. 3, // listening
  261. 5, // accepted
  262. 7, // closed
  263. 9: // disconnected
  264. (
  265. fd: Integer;
  266. );
  267. 1, // connect_delayed
  268. 4, // bind_failed
  269. 6, // accept_failed
  270. 8: // close_failed
  271. (
  272. err: Integer;
  273. );
  274. 2: ( //connect_retried
  275. interval: Integer;
  276. );
  277. end;
  278. {$endif}
  279. function zmq_socket(context: Pointer; stype: Integer): Pointer; cdecl; external libzmq;
  280. function zmq_close(s: Pointer): Integer; cdecl; external libzmq;
  281. function zmq_setsockopt(s: Pointer; option: Integer; optval: Pointer; optvallen: size_t ): Integer; cdecl; external libzmq;
  282. function zmq_getsockopt(s: Pointer; option: Integer; optval: Pointer; var optvallen: size_t): Integer; cdecl; external libzmq;
  283. function zmq_bind(s: Pointer; addr: PAnsiChar): Integer; cdecl; external libzmq;
  284. function zmq_connect(s: Pointer; addr: PAnsiChar): Integer; cdecl; external libzmq;
  285. {$ifdef zmq3}
  286. function zmq_unbind(s: Pointer; addr: PAnsiChar): Integer; cdecl; external libzmq;
  287. function zmq_disconnect(s: Pointer; addr: PAnsiChar): Integer; cdecl; external libzmq;
  288. {$endif}
  289. {$ifdef zmq3}
  290. function zmq_send (s: Pointer; const buffer; len: size_t; flags: Integer): Integer; cdecl; external libzmq;
  291. function zmq_recv (s: Pointer; var buffer; len: size_t; flags: Integer): Integer; cdecl; external libzmq;
  292. {$else}
  293. function zmq_send (s: Pointer; var msg: zmq_msg_t; flags: Integer): Integer; cdecl; external libzmq;
  294. function zmq_recv (s: Pointer; var msg: zmq_msg_t; flags: Integer): Integer; cdecl; external libzmq;
  295. {$endif}
  296. {$ifdef zmq3}
  297. function zmq_sendmsg(s: Pointer; var msg: zmq_msg_t; flags: Integer): Integer; cdecl; external libzmq;
  298. function zmq_recvmsg(s: Pointer; var msg: zmq_msg_t; flags: Integer): Integer; cdecl; external libzmq;
  299. function zmq_socket_monitor( s: Pointer; addr: PAnsiChar; events: Integer ): Integer; cdecl; external libzmq;
  300. {
  301. /* Experimental */
  302. struct iovec;
  303. ZMQ_EXPORT int zmq_sendiov (void *s, struct iovec *iov, size_t count, int flags);
  304. ZMQ_EXPORT int zmq_recviov (void *s, struct iovec *iov, size_t *count, int flags);
  305. }
  306. {$endif}
  307. {******************************************************************************}
  308. {* I/O multiplexing. *}
  309. {******************************************************************************}
  310. const
  311. ZMQ_POLLIN = 1;
  312. ZMQ_POLLOUT = 2;
  313. ZMQ_POLLERR = 4;
  314. type
  315. pollitem_t = record
  316. socket: Pointer;
  317. fd: Integer; // TSocket???
  318. events: Word;
  319. revents: Word;
  320. end;
  321. function zmq_poll( var items: pollitem_t; nitems: Integer; timeout: Longint ): Integer; cdecl; external libzmq;
  322. {******************************************************************************}
  323. {* Built-in devices *}
  324. {******************************************************************************}
  325. {$ifdef zmq3}
  326. {* Built-in message proxy (3-way) *}
  327. function zmq_proxy( frontend, backend, capture: Pointer ): Integer; cdecl; external libzmq;
  328. {$endif}
  329. {* Deprecated aliases *}
  330. const
  331. ZMQ_STREAMER = 1;
  332. ZMQ_FORWARDER = 2;
  333. ZMQ_QUEUE = 3;
  334. {* Deprecated method *}
  335. function zmq_device(device: Integer; insocket,outsocket: Pointer): Integer; cdecl; external libzmq;
  336. {* Helper functions are used by perf tests so that they don't have to care *}
  337. {* about minutiae of time-related functions on different OS platforms. *}
  338. {* Starts the stopwatch. Returns the handle to the watch. *}
  339. function zmq_stopwatch_start: Pointer; stdcall; external libzmq;
  340. {* Stops the stopwatch. Returns the number of microseconds elapsed since *}
  341. {* the stopwatch was started. *}
  342. function zmq_stopwatch_stop( watch: Pointer ): LongWord; stdcall; external libzmq;
  343. {* Sleeps for specified number of seconds. *}
  344. procedure zmq_sleep( seconds: Integer ); stdcall; external libzmq;
  345. implementation
  346. end.