Thank you so much! That worked perfectly :D
On Wednesday, July 29, 2015 at 3:29:13 PM UTC-5, Saúl Ibarra Corretgé wrote:
>
> Hi!
>
> On 29/07/15 21:09, Darrel Cusey wrote:
> > Soooo close...
> >
> > I have successfully started a pipe listener using the code shown below.
> > Now in a separate process, I want to connect the that same pipe and
> > send a message -- but I don't see any documentation on how to define the
> > required uv_stream_t in this scenario. All the examples assume that
> > only the server writes to the pipe (by using the "client" steam from the
> > connect).
> >
> > Here's my server code, which works fine:
> >
> > |
> > #if _WIN32 || _WIN64
> > const char *pipename = "\\\\.\\pipe\\my.pipe";
> > #else
> > cosnt char *pipename = "my.pipe";
> > #endif
> >
> >
> > void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf)
> {
> > if (nread < 0) {
> > if (nread != UV_EOF)
> > fprintf(stderr, "Read error %s\n", uv_err_name(nread));
> > uv_close((uv_handle_t*) client, NULL);
> > return;
> > }
> >
> > fprintf(stdout, "Received message: %s\n", buf->base);
> > free(buf->base);
> > }
> >
> > void on_new_connection(uv_stream_t *server, int status) {
> > if (status == -1) {
> > // error!
> > return;
> > }
> >
> > uv_pipe_t *client = (uv_pipe_t*) malloc(sizeof(uv_pipe_t));
> > uv_pipe_init(loop, client, 0);
> > if (uv_accept(server, (uv_stream_t*) client) == 0) {
> > uv_read_start((uv_stream_t*) client, alloc_buffer, echo_read);
> > }
> > else {
> > uv_close((uv_handle_t*) client, NULL);
>
> You might want to pass 'free' as the callback so the handle's memory is
> released.
>
> > }
> > }
> >
> >
> > void main {
> >
> > loop = uv_default_loop();
> >
> > uv_pipe_t server;
> > uv_pipe_init(loop, &server, 0);
> >
> > signal(SIGINT, remove_sock);
>
> You could use a uv_signal_t handle here.
>
> >
> > char *args[3];
> > char *y = new char[processPath.length()+1];
> > std::strcpy(y, processPath.c_str());
> > char pidBuffer[19];
> > itoa(getProcessID(), pidBuffer, 10);
> > args[0] = y;
> > args[1] = pidBuffer;
> > args[2] = NULL;
> >
> >
> > // startup the listener
> > fprintf(stdout, "Starting Listener...\n");
> > int q;
> > if ((q = uv_pipe_bind(&server, pipename))) {
> > fprintf(stderr, "Bind error %s\n", uv_err_name(q));
> > return false;
> > }
> > if ((q = uv_listen((uv_stream_t*) &server, 16, on_new_connection))) {
> > fprintf(stderr, "Listen error %s\n", uv_err_name(q));
> > return false;
> > }
> >
> >
> > return (uv_run(loop, UV_RUN_DEFAULT) == 0);
> > }
> >
> >
> > |
> >
> >
> > Now, on the client, I want to connect to this pipe and send a message --
> > but can't figure out how to define the uv_stream_t value..
> >
> >
> > |
> > #if _WIN32 || _WIN64
> > const char *pipename = "\\\\.\\pipe\\my.pipe";
> > #else
> > cosnt char *pipename = "my.pipe";
> > #endif
> >
> >
> > main {
> >
> >
> > uv_pipe_t* handle = (uv_pipe_t*)malloc(sizeof(uv_pipe_t));
> > uv_connect_t* connect = (uv_connect_t*)malloc(sizeof(uv_connect_t));
> >
> > uv_pipe_init(uv_default_loop(), handle, 0);
> > uv_pipe_open(handle, socket(PF_UNIX, SOCK_STREAM, 0));
> >
> > int r;
> > uv_pipe_connect(connect, handle, pipename, OnConnect);
> >
>
> You don't need to do uv_pipe_open, that's for using an *existing* fd as
> a pipe. Just call uv_pipe_init and then do the uv_pipe_connect.
>
> > // send a message to the pipe
> >
> >
> >
> > uv_stream_t steam; // <---- How do I define this ????
> >
>
> uv_pipe_t is a "subclass" of uv_stream_t
> (http://docs.libuv.org/en/v1.x/pipe.html#uv-pipe-t-pipe-handle), you can
> just cast it to uv_stream_t. All these funcions work on streams, so you
> just need to cast the handle: http://docs.libuv.org/en/v1.x/stream.html
>
> >
> >
> > uv_write_t *req = (uv_write_t *) malloc(sizeof(uv_write_t));
> > uv_buf_t wrbuf = uv_buf_init("123456789\n", 10);
> > uv_write(req, stream, &wrbuf, 1, echo_write);
> >
> >
> > uv_run(uv_default_loop(), UV_RUN_DEFAULT);
> >
> > }
> >
> > |
> >
> >
> > Can anyone point me in the right direction, I think I'm really close to
> > solving this (????)
> >
>
> Hope that helps!
>
>
> Cheers,
>
> --
> Saúl Ibarra Corretgé
> http://bettercallsaghul.com
>
--
You received this message because you are subscribed to the Google Groups
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/libuv.
For more options, visit https://groups.google.com/d/optout.