/* This code is PUBLIC DOMAIN, and is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND. See the accompanying * LICENSE file. */ #include "apr.h" #include "apr_network_io.h" #include apr_status_t send_and_recv(const char *str, apr_pool_t *pool) { apr_status_t rv = APR_SUCCESS; apr_size_t len, total = 0; apr_sockaddr_t *saddr; apr_socket_t *skt; rv = apr_socket_create(&skt, APR_INET, SOCK_STREAM, APR_PROTO_TCP, pool); if (rv) return rv; rv = apr_sockaddr_info_get(&saddr, "127.0.0.1", APR_UNSPEC, 4747, 0, pool); if (rv) return rv; rv = apr_socket_connect(skt, saddr); if (rv) return rv; len = strlen(str); rv = apr_socket_send(skt, str, &len); if (rv) return rv; for (;;) { char c; len = 1; apr_socket_recv(skt, &c, &len); if (APR_STATUS_IS_EOF(rv)) break; else if (rv) return rv; else if (! len) break; printf("%c", c); if (++total == strlen(str)) break; } return rv; } int main(int argc, const char * const argv[]) { apr_pool_t *pool; apr_status_t rv; if (argc != 2) { fprintf(stderr, "usage: echoclient \n"); return EXIT_FAILURE; } apr_initialize(); atexit(apr_terminate); apr_pool_create(&pool, NULL); rv = send_and_recv(argv[1], pool); if (rv) { char buffer[256] = { 0 }; fprintf(stderr, "error: %s\n", apr_strerror(rv, buffer, sizeof(buffer))); return EXIT_FAILURE; } return EXIT_SUCCESS; }