⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client-sample.c

📁 跨平台windowsunixlinux的c语言编程解决方案
💻 C
字号:
/** * apr tutorial sample code * http://dev.ariel-networks.com/apr/ */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <assert.h>#include <apr_general.h>#include <apr_network_io.h>#include <apr_strings.h>/* default connect hostname */#define DEF_REMOTE_HOST		"localhost"/* default connect port number */#define DEF_REMOTE_PORT		8081/* default socket timeout */#define DEF_SOCK_TIMEOUT	(APR_USEC_PER_SEC * 30)/* default buffer size */#define BUFSIZE			4096/* useful macro */#define CRLF_STR		"\r\n"static apr_status_t do_connect(apr_socket_t **sock, apr_pool_t *mp);static int do_client_task(apr_socket_t *sock, const char *filepath, apr_pool_t *mp);/** * Network client sample code * @remark Error checks omitted */int main(int argc, const char *argv[]){    apr_status_t rv;    apr_pool_t *mp;    apr_socket_t *s;    if (argc != 2) {        printf("usage: %s filepath\n", argv[0]);        return -1;    }        apr_initialize();    apr_pool_create(&mp, NULL);    rv = do_connect(&s, mp);    if (rv != APR_SUCCESS) {        goto error;    }        rv = do_client_task(s, argv[1], mp);    if (rv != APR_SUCCESS) {        goto error;    }    apr_socket_close(s);        apr_terminate();    return 0; error:    {        char errbuf[256];        apr_strerror(rv, errbuf, sizeof(errbuf));        printf("error: %d, %s\n", rv, errbuf);    }    apr_terminate();    return -1;}/** * Connect to the remote host */static apr_status_t do_connect(apr_socket_t **sock, apr_pool_t *mp){    apr_sockaddr_t *sa;    apr_socket_t *s;    apr_status_t rv;        rv = apr_sockaddr_info_get(&sa, DEF_REMOTE_HOST, APR_INET, DEF_REMOTE_PORT, 0, mp);    if (rv != APR_SUCCESS) {	return rv;    }        rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp);    if (rv != APR_SUCCESS) {	return rv;    }    /* it is a good idea to specify socket options explicitly.     * in this case, we make a blocking socket with timeout. */    apr_socket_opt_set(s, APR_SO_NONBLOCK, 1);    apr_socket_timeout_set(s, DEF_SOCK_TIMEOUT);    rv = apr_socket_connect(s, sa);    if (rv != APR_SUCCESS) {        return rv;    }    /* see the tutorial about the reason why we have to specify options again */    apr_socket_opt_set(s, APR_SO_NONBLOCK, 0);    apr_socket_timeout_set(s, DEF_SOCK_TIMEOUT);    *sock = s;    return APR_SUCCESS;}/** * Send a request as a simple HTTP request protocol. * Write the received response to the standard output until the EOF. */static apr_status_t do_client_task(apr_socket_t *sock, const char *filepath, apr_pool_t *mp){    apr_status_t rv;    const char *req_hdr = apr_pstrcat(mp, "GET ", filepath, " HTTP/1.0" CRLF_STR CRLF_STR, NULL);    apr_size_t len = strlen(req_hdr);    rv = apr_socket_send(sock, req_hdr, &len);    if (rv != APR_SUCCESS) {        return rv;    }    {        apr_file_t *stdout;        apr_file_open_stdout(&stdout, mp);        while (1) {            char buf[BUFSIZE];            apr_size_t len = sizeof(buf);                        apr_status_t rv = apr_socket_recv(sock, buf, &len);            if (rv == APR_EOF || len == 0) {                break;            }            apr_file_write(stdout, buf, &len);        }        apr_file_close(stdout);    }    return rv;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -