All special cased errors in the ZMQ library does map into the Unix.error type.

The C code could raise an unix error if errno < ZMQ_HAUSNUMERO, and the ZMQ exception for the others as it does currently. 

The ocaml code should then for all function calls catch and convert the "standard" error codes into corresponding Unix.Unix_error. The ZMQ_exception type should then only expose the four special Zmq type errors. This would work for both Windows and Unix. 

As you say, the unixsupport.c does handle cases if the platform does not know about e.g. EPROTONOSUPPORT. I would assume that this legacy code from old platforms that did not define these POSIX errors. I would assume that ZMQ clib has a generic problem on these platforms and the bindings cannot solve that.