Go to the first, previous, next, last section, table of contents.
#include <mailutils/stream.h>
MU_STREAM_READ
MU_STREAM_WRITE
MU_STREAM_RDWR
MU_STREAM_APPEND
MU_STREAM_CREAT
MU_STREAM_NONBLOCK
MU_STREAM_NO_CHECK
MU_STREAM_STATE_OPEN
stream_open
.
MU_STREAM_STATE_READ
stream_read
or stream_readline
.
MU_STREAM_STATE_WRITE
stream_write
.
MU_STREAM_STATE_CLOSE
stream_close
.
An example using tcp_stream_create
to make a simple web client:
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/select.h> #include <mailutils/io.h> const char *wbuf = "GET / HTTP/1.0\r\n\r\n"; char rbuf[1024]; int main(int argc, char **argv) { int ret, off = 0, fd; stream_t stream; size_t nb; fd_set fds; argc = argc, argv = argv; ret = tcp_stream_create (&stream); if (ret != 0) { fprintf (stderr, "tcp_stream_create: %s\n", mailutils_error(ret)); exit (EXIT_FAILURE); } connect_again: ret = stream_open (stream, "www.netscape.com", 80, MU_STREAM_NONBLOCK); if (ret != 0) { if (ret == MU_ERROR_EAGAIN) { ret = stream_get_fd(stream, &fd); if (ret != 0) { fprintf (stderr, "stream_get_fd: %s\n", mailutils_error(ret)); exit (EXIT_FAILURE); } FD_ZERO (&fds); FD_SET (fd, &fds); select (fd+1, NULL, &fds, NULL, NULL); goto connect_again; } fprintf (stderr, "stream_open: %s\n", mailutils_error (ret)); exit (EXIT_FAILURE); } ret = stream_get_fd (stream, &fd); if (ret != 0) { fprintf(stderr, "stream_get_fd: %s\n", strerror(ret)); exit (EXIT_FAILURE); } write_again: ret = stream_write (stream, wbuf + off, strlen (wbuf), 0, &nb); if (ret != 0 ) { if (ret == EAGAIN) { FD_ZERO (&fds); FD_SET (fd, &fds); select (fd + 1, NULL, &fds, NULL, NULL); off += nb; goto write_again; } fprintf (stderr, "stream_write: %s\n", strerror(ret)); exit (EXIT_FAILURE) } if (nb != strlen (wbuf)) { fprintf(stderr, "stream_write: %s\n", "nb != wbuf length"); exit (EXIT_FAILURE); } do { read_again: ret = stream_read (stream, rbuf, sizeof (rbuf), 0, &nb); if (ret != 0) { if (ret == EAGAIN) { FD_ZERO (&fds); FD_SET (fd, &fds); select (fd + 1, &fds, NULL, NULL, NULL); goto read_again; } fprintf (stderr, "stream_read: %s\n", strerror(ret)); exit(EXIT_FAILURE); } write (2, rbuf, nb); } while (nb); ret = stream_close (stream); if (ret!= 0) { fprintf (stderr, "stream_close: %s\n", strerror(ret)); exit (EXIT_FAILURE); } stream_destroy (&stream, NULL); exit (EXIT_SUCCESS); }
Go to the first, previous, next, last section, table of contents.