分类:Tech

共 22 篇文章

C预处理器宏展开

最近在写一个用于简化生成代码的宏,该宏大致希望达到如下功能:

// macro.h
#if defined(T)
void T ## _func()
{
// ...
}
#endif

这段代码是不能用的,因为预处理符号##是不能用在代码中的,这里只是用来表示下宏希望实现的目的,即定义一个T,就为之定义一个对应的方法,比如说:

// 这段代码希望定义一个int_func方法
#define T int
#include "macro.h"
#undef T

上面提到了##是不能直接写在代码里的,所以我一开始是这样实现的:

// macro.h
#if defined(T)
#define func_m(TN) TN ## _func
#define T_func func_m(T)
void T_func()
{
// ...
}
#endif

但是,这样的写法并不能够正确的定义我们例子中想要的int_func ...

阅读全文

HTTP请求中的数据

那天在帮同学调代码的时候发现自己对于HTTP Request的细节很模糊,对于各种形式的数据是如何被处理封装成HTTP报文的、在报文中的哪个位置,并不是非常的清楚,因此,查了查资料后写了这篇东西。

HTTP请求格式

先看看HTTP请求消息的格式 1

  • A Request Line
  • Zero or more header (General|Request|Entity) fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
  • Optionally a message-body

从格式上来看,除了第三部分,都能够附带用户数据,但一般来说 ...

阅读全文

Openssl-RSA简单使用

最近需要用到RSA的一些功能,出于方便,打算直接用openssl,但是在不同平台上使用openssl所需要做的工作还不一样,干脆就记个笔记整理一下。

Windows下使用VS2013编译openssl源码

源码可以去官网下载,先前下过1.0.2d的源码,但是编译老失败,后面换成1.0.1p的就成功了,原因未知。

编译需要用到perl,去官网下个ActivePerl就可以了,为了往后在cmd中操作简单,最好安装时勾上加入PATH的选项。

解压源码包,打开cmd进入该解压后的目录,执行如下命令:

perl Configure VC-WIN32 no-asm --prefix=C:\openssl-1.0.1p\VC-WIN32

这是编译前必须执行的配置命令,可以自行根据所使用的编译工具以及平台的不同来选择不同的参数(具体可以查看解压后目录中的README以及一系列的INSTALL文件),稍微解释一下:

  • VC-WIN32:表示希望使用VS来编译生成WIN32下使用的openssl库,还可以是其他的比如debug-VC-WIN32、VC-WIN64A等等。
  • no-asm:表示编译不使用汇编语言文件,这样可以避免出现与NASM相关的错误。
  • prefix:此参数后面的值用于指定编译结果的安装目录。

使用VS编译会使用到VS的nmake、cl、link等工具,默认情况下这些工具是不在PATH里的,所以正常打开cmd是没法找到这些工具的 ...

阅读全文