#include #include "al.h" #include "sio.h" #include "sa.h" #include #include 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; }