Is anyone have tried to make a workable binding for libuv?



I’m a completely newbie here working on a hobby project and I want to try (and learn) Rust this time. And the project itself includes a HTTP server and a TCP server, so I thought I may need some network support.

Digging through the GitHub, I found mio and tokio project, but they’re both under 1.0 yet, so I turn my head around searching for libuv (which is very handy in C) bindings.

That’s when I discovered this crate by sorear, but it gives me segment fault (Of course it does, the uv_loop_t has been changed in the newer version). And it’s the only libuv binding crate out there as far as I can found.

So I started binding the libuv myself (TCP part of it actually, and which is very hard consider I only half way through the Rust book).

My main problem here is the size of those C structures. For struct like uv_loop_t, they made a function named uv_loop_size which will return the size of the uv_loop_t so I can just libc::malloc that size of memory. But for many other structs, they didn’t provide such function.

So, is that to say I have to manually add each member of the C struct to a Rust struct and keep them aligned in memory? If true then, that means a lot of work (and keep ups) …

My second problem is about struct casting. In C, I can cast anything by just (something) val, but it seems Rust won’t allow me do that.

For example, when I trying to cast libc::sockaddr_in to libc::sockaddr by using as, the Rust compiler told me it’s invalid, so I had to mem::transmute it. But … mem::transmute do that by copies the bits from the source value into the destination value, and I don’t like it. So I want to know is there any other better way to cast these struct?

Thank you.

BTW: I’ve tried bindgen, and failed to get it to work for libuv correctly, sad :frowning:


mio is widely used in production (IIRC, some parts of dropbox infra are build on top of mio), so, while it is not technically 1.0, it is dependable.


I’d second at least using mio.


OK guys, I will just use mio then. :slight_smile: