24
Aug
August 24, 2018 分类: ASM/C/C++     作者: hoverlees     留言: 发表

为了实现这个功能, 今天写了一个, 在这里记录下来.

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;

static uint8_t is_ip_address(uint8_t* host, uint8_t ipBuf[4]){
    uint8_t* p=host;
    uint8_t fieldIndex=0;
    uint8_t numberNum=0;
    uint16_t fieldValue=0;
    while(*p){
        if(*p>='0' && *p<='9'){
            numberNum++;
            fieldValue*=10;
            fieldValue+=(*p-'0');
            if(fieldValue>255) return 0;
        }
        else if(*p=='.'){
            if(numberNum==0) return 0;
            ipBuf[fieldIndex]=fieldValue;
            fieldIndex++;
            if(fieldIndex>=4) return 0;
            numberNum=fieldValue=0;
        }
        else return 0;
        p++;
    }
    if(fieldIndex!=3 || numberNum==0) return 0;
    ipBuf[3]=fieldValue;
    return 1;
}
02
Sep
September 2, 2016 分类: ASM/C/C++     作者: hoverlees     留言: 3

libvlc基本具有vlc的所有功能,同时能方便的嵌入到应用程序中, 所以很适合做视频相关类的应用.
当使用libvlc截图的时候, 可以发现它会在视频上显示一个略缩图和地址几秒钟, 对于程序自动截屏而言,很影响体验.
看头文件看了很久也没有找到办法,本来打算下个vlc源码来改改重新编译了,结果后来发现VLC客户端上,有关闭略缩图和地址的选项,就顺着找了一会, 发现这两个选项可以在创建vlc实例(调用libvlc_new函数)的时候设置.
libvlc_new的定义:

libvlc_instance_t * 	libvlc_new (int argc, const char *const *argv);

从参数上可以感觉这个argc和argv一般都是传应用程序启动参数,所以就试着使用了vlc的启动参数来关闭预览和字幕,

char* argv[2]={"--no-osd","--no-snapshot-preview"}; //不显示字幕和截图预览,可参考VLC的启动参数设置更多的参数.
inst=libvlc_new(2,argv);

果然有效,搞定!

09
Jan
January 9, 2016 分类: ASM/C/C++     作者: hoverlees     留言: 发表

做自动部署时特地写的小工具,命令写ini文件

使用方式: writeINI <file> <section> <key> <value>

程序下载:
writeINI

31
Aug
August 31, 2014 分类: ASM/C/C++     作者: hoverlees     留言: 发表

RC4是对称加密中比较好的加密算法,通过维护一个256长度的状态表实现一种基于密码的异或加密。下面是最近写的一个标准的RC4加密函数库,解密使用同样的函数即可。

/**
 RC4加密解密函数
 @auhtor Hoverlees http://www.hoverlees.com
 */

#ifndef _RC4_H
#define _RC4_H

typedef struct rc4_context{
    unsigned char sbox[256];
}rc4_context;

/**
 * 初始化RC4状态表
 * @param context RC4上下文
 * @param key 加密密钥
 * @param keyLen 密钥长度,如果为-1,程序通过strlen去计算长度
 */
void rc4_init(rc4_context* context,const char* key,int keyLen);

/**
 * RC4加密
 * @param context 上下文
 * @param data 要加密的数据
 * @param dataLen 数据长度,如果data为字符串,该值可以为-1
 * @param out 加密后保存的缓存,长度必须大于等于dataLen
 * @return 加密后的数据长度,一般为dataLen
 */
int rc4_crypt(rc4_context* context,const char* data,int dataLen,char* out);

/**
 * RC4一次性加密
 * @param key 密钥
 * @param keyLen 密钥长度,如果密钥为字符串,该值可为-1
 * @param data 要加密的数据
 * @param dataLen 数据长度,如果data为字符串,该值可以为-1
 * @param out 加密后保存的缓存,长度必须大于等于dataLen
 * @return 加密后的数据长度,一般为dataLen
 */
int rc4_crypt_once(const char* key,int keyLen,const char* data,int dataLen,char* out);
#endif


查看详细内容 »

02
Aug
August 2, 2014 分类: ASM/C/C++     作者: hoverlees     留言: 发表

昨天搞到一个魔豆路由器,由于这个路由器开放权限,所以手就很痒的玩了起来。

把我以前写的epoll服务器编译后上传上去,发现在接收到数据的时候程序总没反应,经过调试,发现epoll的epoll_event传的data在epoll_wait时拿到总是空,所以初步断定是内核的问题,查看内核是linux matrix 2.6.36,这个版本epoll才加入没多久,有问题应该也是可能的。

下了结论,然后再想想其实这种嵌入式设备也没必要处理大并发,所以就用select去实现了服务器,意料之中的,效果非常棒,ab测试下的benchmark在64并发10000请求条件下,比路由器上的nginx要高很多(肯定的,因为还没做http请求解析)。接下来要优化一下服务器,再把http的解析加上去。

另外,魔豆路由器的系统目录默认是只读的,要设置自己的程序开机自动执行,需要执行writesys.sh才能进行配置,配置完成后再使用writesys.sh close 把目录改回只读。

06
Apr
April 6, 2014 分类: ASM/C/C++     作者: hoverlees     留言: 发表

前两天发了java版的,现在把c的代码也帖出来,这个是用到我的websocket server工程中的代码。

base64.h

/**
Base64编码解码函数
@auhtor Hoverlees http://www.hoverlees.com
*/

#ifndef _BASE64_H
#define _BASE64_H

/**
 * base64编码
 * @param input 需要编码的内容
 * @param inputLen 需要编码的内容的长度
 * @param output 编码后的内容将存到该指针指向的内存,请确保内存有 inputLen*4/3的字节数
 * @return 编码后的字节长度
 */
int base64_encode(const char* input,int inputLen,char* output);


/**
 * base64解码
 * @param input 需要解码的内容
 * @param inputLen 需要解码的内容的长度
 * @param output 解码后的内容将存到该指针指向的内存,请确保内存有 inputLen*3/4的字节数
 * @return 解码后的字节长度
 */
int base64_decode(const char* input,int inputLen,char* output);

#endif


查看详细内容 »

标签:
16
Mar
March 16, 2014 分类: ASM/C/C++     作者: hoverlees     留言: 发表

我的博客里写的关于C语言访问COM的一些文章帮助了一些朋友,感到非常高兴。最近有几个朋友发邮件问过我C梆定ActiveX事件的方式,解答后感觉好像也有段时间没有写文章了,所以就详细地来写一篇关于C梆定和监听ActiveX事件的文章。

对C访问COM不是很了解的朋友,可以看我博客里的这些文章:

C语言使用ActiveX控件

C语言访问Windows COM组件函数

本文链接: http://www.hoverlees.com/blog/?p=1793


查看详细内容 »

标签:
15
Feb
February 15, 2013 分类: ASM/C/C++, Interesting     作者: hoverlees     留言: 2

过年也有没事做耍电脑的时候,就用C在windows上写了个websocket客户端的五子棋,这个是用opengl画的,棋盘是3D的但做得简陋,用socket实现的websocket协议与以前写的websocket server通信,可以与以前实现的HTML5五子棋游戏对玩。

前面挂了个“电视机”,房间没人进入的时候是没有信号的状态,有人进入后会显示钓鱼脸先生。


查看详细内容 »

11
Jan
January 11, 2013 分类: ASM/C/C++     作者: hoverlees     留言: 发表

Go语言十分简单,跨平台,非常适用于网络应用的开发,本人相当看好。不过很多时候,还是需要扩展Go让Go实现更多的功能,如操作底层硬件、创建窗口等,这个要求可以通过调用C的方式实现。

本文以windows下的Go开发为例,linux完全一样。当然,Windows上首先要安装MinGW.

http://www.hoverlees.com/blog/?p=1465

先做一个GO显示一个对话框窗口的简单示例。在go目录src/pkg下新建一个文件夹名为hover,新建一个hover.go文件,内容如下

package hover
//#include <windows.h>
import "C"
func Msgbox(title string,body string) int{
	C.MessageBox(nil,(*C.CHAR)(C.CString(body)),(*C.CHAR)(C.CString
(title)),0);
	return 0;
}

与其说这是一个go源码文件,还不如把它理解成C语言的模板文件,cgo编译时,会把这个文件的内容转换成C程序并使用gcc编译,所以本人强列推荐将这个程序当成C程序阅读。程序中第二行的注释会在转换成C语言时做为C的代码。Msgbox会调用Windows系统函数MessageBox,并传入对应参数。由于go的数据类型与C语言的数据类型在内存中的表示不同,所以需要转换。Go与C的数据类型对有对应的转换方式,具体可以参看文档。因为MessageBox的第二第三个参数是LPSTR(unsigned char*),所以在调用时需要将Go的string转换成LPSTR类型。

接下来编译和安装函数包:

go build hover
go install hover

编译完成后,可以在程序中import这个hover库。下面写一个简单的程序调用刚刚写好的函数

package main
import "hover"
func main(){
	hover.Msgbox("title","body");
}

最终生成的程序会弹出一个对话框,标题和内容都按程序指定的显示。


查看详细内容 »

标签: ,
09
Dec
December 9, 2012 分类: ASM/C/C++, DHTML     作者: hoverlees     留言: 2

有vps就是好! 抽了几个周末的空闲时间完成了火拼俄罗斯的websocket服务器及客户程序,现在已经支持新版的websocket协议和苹果设备支持的websocket协议. 做这个的初衷是为了几个人在一起无聊的时候可以用手机连机玩些小游戏打发无聊时光.本人已经测试即使走最慢的移动的Edge网络,也不影响相互连机.

火拼俄罗期电脑的玩法跟QQ游戏的一样,上下左右方向键控制移动和旋转,空格直接下落,数字1,2,3,4使用道具给指定号码的玩家.

手机是通过在屏幕任意位置滑动时左右移动,点击自己游戏区域的上部变形,点击自己游戏区域的下部分下落,点击玩家编号向指定玩家使用道具.

游戏大厅地址: http://www.hoverlees.com/game

这个是直接登录链接: 点击这里直接登录


查看详细内容 »

标签:
快速链接
推荐标签
最新图片
较新文章
随机推荐
友情链接