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

Greeting,

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.

3 Likes

I'd second at least using mio.

1 Like

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