ossp-pkg/sio/sio_test.c
1.3
#include <stdio.h>
#include "al.h"
#include "sio.h"
#include "sa.h"
#include <openssl/ssl.h>
#include <openssl/bio.h>
extern BIO_METHOD *BIO_s_socket();
extern sio_module_t sio_module_bio;
extern sio_module_t sio_module_hello;
extern sio_module_t sio_module_buffer;
#define e(f) rc = f; printf("%s = %s\n",#f, sio_error(rc)); fflush(stdout);
#define s(f) src = f; printf("%s = %s\n",#f, sa_error(src)); fflush(stdout);
int main(int argc, char *argv[])
{
sio_rc_t rc;
sio_t *sio;
sio_stage_t *sios_bio, *sios_hello, *sios_buffer;
sa_rc_t src;
sa_addr_t *saa;
sa_t *msa, *sa;
char *uri;
int fd;
BIO *bio;
char buf[] = "Hello world\n";
size_t actual;
size_t buflen;
s(sa_create(&msa));
s(sa_option(msa, SA_OPTION_REUSEADDR, 1));
s(sa_addr_create(&saa));
uri = "inet://localhost:25001#tcp";
s(sa_addr_u2a(saa, uri));
s(sa_bind(msa,saa));
s(sa_addr_destroy(saa));
uri = NULL;
e(sio_create(&sio));
e(sio_create_stage(sio, &sio_module_bio, &sios_bio));
e(sio_create_stage(sio, &sio_module_hello, &sios_hello));
e(sio_create_stage(sio, &sio_module_buffer, &sios_buffer));
buflen = 256;
e(sio_configure_stage(sio, sios_bio, "inputsize", &buflen));
buflen = 1000;
e(sio_configure_stage(sio, sios_buffer, "outputsize", &buflen));
s(sa_listen(msa, 5));
for(;;) {
s(sa_accept(msa, &saa, &sa));
s(sa_addr_a2u(saa, &uri));
printf("Connection from %s\n",uri);
s(sa_addr_destroy(saa));
bio = BIO_new(BIO_s_socket());
sa_getfd(sa, &fd);
BIO_set_fd(bio, fd, 0);
e(sio_configure_stage(sio, sios_bio, "bio", bio));
e(sio_attach(sio, sios_buffer, SIO_MODE_WRITE));
e(sio_attach(sio, sios_hello, SIO_MODE_READWRITE));
e(sio_attach(sio, sios_bio, SIO_MODE_READWRITE));
e(sio_write(sio, buf, sizeof(buf)-1, &actual));
e(sio_push(sio));
e(sio_detach(sio, sios_bio));
e(sio_detach(sio, sios_hello));
e(sio_detach(sio, sios_buffer));
sa_destroy(sa);
}
e(sio_destroy_stage(sio, sios_buffer));
e(sio_destroy_stage(sio, sios_hello));
e(sio_destroy_stage(sio, sios_bio));
e(sio_destroy(sio));
sa_destroy(msa);
return 0;
}