热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

libevent(六)httpserver

客户端:#include#include#include#include#inc

客户端:

#include
#include

#include
<string.h>
#include

#include
#include event.h>
#include

#include

#include

#include
#define DEFAULT_URL "http://127.0.0.1:8080"void http_request_done(struct evhttp_request *req, void *arg){char buffer[256];int nread;if (req &#61;&#61; NULL) {printf("request failed\n");return;}fprintf(stderr, "Response line: %d %s\n",evhttp_request_get_response_code(req),req->response_code_line);while ((nread &#61; evbuffer_remove(evhttp_request_get_input_buffer(req),buffer, sizeof(buffer)))> 0) {fwrite(buffer, nread, 1, stdout);}
}
int main(int argc, char **argv){char *url &#61; DEFAULT_URL;if (argc &#61;&#61; 2) {url &#61; argv[1];}struct evhttp_uri *http_uri &#61; NULL;const char *scheme, *host, *path, *query;char uri[256];int port;http_uri &#61; evhttp_uri_parse(url);scheme &#61; evhttp_uri_get_scheme(http_uri);if (scheme &#61;&#61; NULL || (strcasecmp(scheme, "https") !&#61; 0 &&strcasecmp(scheme, "http") !&#61; 0)) {printf("url must be http or https\n");return 1;}host &#61; evhttp_uri_get_host(http_uri);port &#61; evhttp_uri_get_port(http_uri);if (port &#61;&#61; -1) {port &#61; (strcasecmp(scheme, "http") &#61;&#61; 0) ? 80 : 443;}path &#61; evhttp_uri_get_path(http_uri);if (strlen(path) &#61;&#61; 0) {path &#61; "/";}query &#61; evhttp_uri_get_query(http_uri);if (query &#61;&#61; NULL) {snprintf(uri, sizeof(uri) - 1, "%s", path);} else {snprintf(uri, sizeof(uri) - 1, "%s?%s", path, query);}uri[sizeof(uri) - 1] &#61; &#39;\0&#39;;printf("url: %s\n", url);printf("scheme: %s\n", scheme);printf("host: %s\n", host);printf("port: %d\n", port);printf("path: %s\n", path);printf("uri: %s\n", uri);struct event_base *base;struct evhttp_connection *conn;struct evhttp_request *req;base &#61; event_base_new();conn &#61; evhttp_connection_base_new(base, NULL, host, port);req &#61; evhttp_request_new(http_request_done, base);evhttp_add_header(req->output_headers, "Host", host);//evhttp_add_header(req->output_headers, "Connection", "close");
evhttp_make_request(conn, req, EVHTTP_REQ_GET, uri);event_base_dispatch(base);return 0;
}

服务器&#xff1a;

#include
#include

#include

#include

#include
event.h>
#include
#define DEFAULT_PORT 8080void http_request_cb(struct evhttp_request *req, void *arg);
void print_request(struct evhttp_request *req, void *arg);
void php_request_cb(struct evhttp_request *req, void *arg);int main(int argc, char **argv) {int port &#61; DEFAULT_PORT;if (argc &#61;&#61; 2) {port &#61; atoi(argv[1]);}struct event_base *base &#61; event_base_new();struct evhttp *http &#61; evhttp_new(base);evhttp_set_gencb(http, http_request_cb, NULL);evhttp_set_cb(http, "/index.php", php_request_cb, NULL);evhttp_bind_socket(http, "0.0.0.0", port);event_base_dispatch(base);return 0;
}
void php_request_cb(struct evhttp_request *req, void *arg) {printf("run php_request_cb...\n");
}
void http_request_cb(struct evhttp_request *req, void *arg) {printf("run http_request_cb...\n");print_request(req, arg);const char *uri &#61; evhttp_request_get_uri(req);printf("uri: %s\n", uri);const char *decoded_uri &#61; evhttp_decode_uri(uri);printf("decoded_uri: %s\n", decoded_uri);struct evhttp_uri *decoded &#61; NULL;const char *path;/* Decode the URI */decoded &#61; evhttp_uri_parse(uri);if (!decoded) {printf("It&#39;s not a good URI. Sending BADREQUEST\n");evhttp_send_error(req, HTTP_BADREQUEST, 0);return;}/* Let&#39;s see what path the user asked for. */path &#61; evhttp_uri_get_path(decoded);if (!path) path &#61; "/";printf("path: %s\n", path);struct evbuffer *evb &#61; evbuffer_new();evbuffer_add_printf(evb, "Server response");evhttp_send_reply(req, HTTP_OK, "OK", evb);evbuffer_free(evb);
}
void print_request(struct evhttp_request *req, void *arg) {const char *cmdtype;struct evkeyvalq *headers;struct evkeyval *header;struct evbuffer *buf;switch (evhttp_request_get_command(req)) {case EVHTTP_REQ_GET: cmdtype &#61; "GET"; break;case EVHTTP_REQ_POST: cmdtype &#61; "POST"; break;case EVHTTP_REQ_HEAD: cmdtype &#61; "HEAD"; break;case EVHTTP_REQ_PUT: cmdtype &#61; "PUT"; break;case EVHTTP_REQ_DELETE: cmdtype &#61; "DELETE"; break;case EVHTTP_REQ_OPTIONS: cmdtype &#61; "OPTIONS"; break;case EVHTTP_REQ_TRACE: cmdtype &#61; "TRACE"; break;case EVHTTP_REQ_CONNECT: cmdtype &#61; "CONNECT"; break;case EVHTTP_REQ_PATCH: cmdtype &#61; "PATCH"; break;default: cmdtype &#61; "unknown"; break;}printf("Received a %s request for %s\nHeaders:\n",cmdtype, evhttp_request_get_uri(req));headers &#61; evhttp_request_get_input_headers(req);for (header &#61; headers->tqh_first; header;header &#61; header->next.tqe_next) {printf(" %s: %s\n", header->key, header->value);}buf &#61; evhttp_request_get_input_buffer(req);puts("Input data: <<<");while (evbuffer_get_length(buf)) {int n;char cbuf[128];n &#61; evbuffer_remove(buf, cbuf, sizeof(cbuf));if (n > 0)(void) fwrite(cbuf, 1, n, stdout);}puts(">>>");
}

 

转:https://www.cnblogs.com/gattaca/p/6635869.html



推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
author-avatar
手机用户2502884057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有