2012年10月26日
摘要: 通常情况下,我们只是对普通数据进行交换,交换指针的问题很少涉及,今天看书时候想到了指针交换问题,这里总结下,也方便我以后查阅。首先看下整型两个数据的交换(这个比较简单,就不多介绍了),核心代码如下:1 void m_swap(int *a,int *b)2 {3 int tmp = *a;4 *a = *b;5 *b = tmp;6 }指针是内存地址,应该也算是整型变量,交换两个指针和交换两个整型变量类似,下面以两种方式进行。传统C方式可以通过传递指向指针的指针来进行交换,核心代码如下:1 void m_swap(int **a,int **b)... 阅读全文
posted @ 2012-10-26 00:47 Mike_Zhang 阅读(6588) 评论(3) 推荐(1)
  2012年10月22日
摘要: 创建在C++中,允许动态创建const对象,格式如下:const int *p = new const int(128);与其他常量一样,动态创建的const对象必须在创建时初始化,并且初始化后,其值不能改变。删除尽管不能改变const对象的值,但可以删除动态创建的const对象,格式如下:delete p;这个和普通的对象一样,可以对其进行删除操作。应用场景举例1、加载配置文件从配置文件读入的数据可以用来初始化const对象,供后续程序使用。伪代码如下:int num;... //读取配置文件,并将配置数据填充到numconst int *pNum = new const int(num); 阅读全文
posted @ 2012-10-22 23:04 Mike_Zhang 阅读(1107) 评论(0) 推荐(0)
  2012年10月21日
摘要: Libevent简介libevent是一个基于事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。官网:http://libevent.org/特点:事件驱动,高性能;轻量级,专注于网络,不如ACE那么臃肿庞大,只提供了简单的网络API的封装,线程池,内存池,递归锁等均需要自己实现;开放源码,代码相当精炼、易读;跨平台,支持Windows、Linux、BSD和Mac OS;支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型 阅读全文
posted @ 2012-10-21 22:40 Mike_Zhang 阅读(2175) 评论(1) 推荐(1)
摘要: 1、逻辑或的短路首先看如下代码:#include <iostream>using namespace std;int main(){ int a = 1; cout << "a = " << a <<endl; true || (a=0); cout << "a = " << a <<endl;}运行结果:a = 1a = 1逻辑或的表现形式如下:expression1 || exexpression2这里用到了逻辑或,由于逻辑或的短路,expression1为true, 阅读全文
posted @ 2012-10-21 00:02 Mike_Zhang 阅读(3265) 评论(2) 推荐(1)
  2012年10月18日
摘要: STL的find_if函数功能很强大,可以使用输入的函数替代等于操作符执行查找功能(这个网上有很多资料,我这里就不多说了)。比如查找一个数组中的奇数,可以用如下代码完成(具体参考这里:http://www.cplusplus.com/reference/algorithm/find_if/):#include <iostream>#include <algorithm>#include <vector>using namespace std;bool IsOdd (int i) { return ((i%2)==1);}int main () { vecto 阅读全文
posted @ 2012-10-18 21:17 Mike_Zhang 阅读(2189) 评论(5) 推荐(2)
  2012年10月15日
摘要: 这段时间在开发代理服务器,这方面的资料了解的比较多,这里我总结下udp代理服务的实现,也方便我以后查阅。一、通信模型1、非代理情况下的通信模型这是典型的C-S通信模型,客户端和服务器直接交互。2、代理情况下的通信模型这种情况下,服务器和客户端不是直接交互,而是通过代理服务器进行的,代理服务器负责把客户端发来的请求转发给服务器,并把服务的回应返回给客户端。二、UDP服务器和客户端demo上面分析了通信模型,这里给出一个echo的服务器和客户端代码以供下文使用。1、服务端demo这里有一个python实现的echo服务器,代码如下:#! /usr/bin/python# a simple udp 阅读全文
posted @ 2012-10-15 00:19 Mike_Zhang 阅读(9152) 评论(0) 推荐(0)
  2012年10月9日
摘要: 我之前的一篇文章(http://www.cnblogs.com/MikeZhang/archive/2012/03/07/socketRedirect.html )中介绍过用python写的一个简单的http端口转发程序,其实那个也算是个代理服务器,只是功能比较简单罢了。由于这段时间在开发代理服务器,接触到各个方面的资料,这里总结下,也方便我以后使用。一、netcat实现网址:http://netcat.sourceforge.net/ netcat是个很强大的工具,在网络工具中有“瑞士军刀”美誉,不懂的搜索下,我就不多说了,相关用法可参考这里:http://en.wikipedia.org. 阅读全文
posted @ 2012-10-09 23:48 Mike_Zhang 阅读(11865) 评论(7) 推荐(2)
  2012年10月3日
摘要: 经常用wireshark写一些如下的表达式进行过滤和特定主机的通信:ip.src==192.168.1.100 or ip.dst==192.168.1.100如图所示:由于wireshark中的Filter框的下拉列表只有两个历史记录(这个暂时没有找到配置的地方……),如果涉及的主机比较多的话,需要每次输入过滤器中的ip(或者更改),感觉比较麻烦。由于这段时间经常用,发现一个小技巧,这里写出来分享给大家,不足之处欢迎指出。我们可以看到,在Filter框的右侧有个Save按钮:点击Save按钮,弹出如下对话框(我填了“Filer100”):点击OK后,发现在右侧出现了个Filter100的按钮 阅读全文
posted @ 2012-10-03 10:01 Mike_Zhang 阅读(2319) 评论(0) 推荐(0)
  2012年9月30日
摘要: STL的string很强大,用起来也感觉很舒服,这段时间在代码中涉及到了用string存取二进制数据的问题,这里记录一下,以供以后参考。首先提一下STL中string的参考资料:http://www.cplusplus.com/reference/string/string/ ,不懂的朋友可以看下。在数据传输中,二进制数据的buffer一般用系统预设的大数组进行存储,而不是STL的string等,比如:const int max_length = 1024 * 1024;unsigned char data[max_length];因为二进制数据中可能会包含0x00(即:'\0' 阅读全文
posted @ 2012-09-30 23:20 Mike_Zhang 阅读(6022) 评论(0) 推荐(0)
  2012年9月24日
摘要: 这段时间涉及到RTSP代理的问题,感觉VLC做这方面的demo比较好,这里总结下,也方便我以后查阅。环境:DarwinStreamingServer 6.0.3 + VLC 2.0.3我之前的一篇文章(http://www.cnblogs.com/MikeZhang/archive/2012/09/09/vlcStreamingServer20120909.html )中介绍过怎样用vlc搭建简单流媒体服务器,其实这里也只是把sample1.avi替换成rtsp链接罢了,本文中只以RSTP的方式示例。界面操作方式这里主要介绍下服务器的搭建,客户端就不介绍了,不懂的朋友参考我这篇文章:http: 阅读全文
posted @ 2012-09-24 00:19 Mike_Zhang 阅读(5613) 评论(3) 推荐(1)
  2012年9月22日
摘要: 用过python的朋友应该知道,python的string中有个replace函数,其功能是实现字符串的替换,默认情况下是替换所有,如果加入参数的话会根据设定的个数进行替换,比如下面的例子:>>> import string>>> str1 = "ab1ab2ab3ab4">>> print string.replace(str1,"ab","cd")cd1cd2cd3cd4>>> print string.replace(str1,"ab", 阅读全文
posted @ 2012-09-22 22:44 Mike_Zhang 阅读(7863) 评论(9) 推荐(1)
  2012年9月16日
摘要: 通常情况下rtsp协议中数据传输的实现是UDP,因工作需要,想让rtsp的数据传输部分用TCP实现。DarwinStreamingServer服务器能自适应客户端发起的数据传输请求是用TCP方式,还是用UDP方式,这里唯一需要解决的是客户端协议的发起问题,而vlc支持RTSP over TCP的方式。剩下的问题就好办了,让vlc以TCP的方式发起连接即可。DSS的安装配置我就不介绍了,不懂的朋友网上查下。方式一:TCP传输媒体数据我之前的文章(http://www.cnblogs.com/MikeZhang/archive/2012/09/09/vlcStreamingServer201209 阅读全文
posted @ 2012-09-16 23:05 Mike_Zhang 阅读(19094) 评论(0) 推荐(4)
摘要: 周末了,也该把上周工作中用到的雕虫小技整理下,写成博客,也方便我以后查阅。最近需要用ffmpeg进行视频转码,考虑到ffmpeg这个工具本身支持多线程,而服务器也是多核的,想最大程度发挥服务器的计算能力。显然不能用单线程了,但是线程并不是越多越好,需要找到个平衡点。这就需要用time命令进行计时,并将该屏幕的输出重定向到文件,以便后期进行分析。ffmpeg编码的介绍网上有很多,我这里也有些示例(http://www.cnblogs.com/MikeZhang/archive/2012/07/17/videoCodec.html 中的“三、视频编码工具 ”中有介绍)。今天主要介绍下ffmpeg的 阅读全文
posted @ 2012-09-16 11:30 Mike_Zhang 阅读(14642) 评论(12) 推荐(1)
  2012年9月9日
摘要: 这段时间用到了流媒体数据传输的TCP和UDP方式,感觉vlc可以做这方面的demo,这里总结下,也方便我以后查阅。 简介 VLC主页:http://www.videolan.org VLC不仅仅是个播放器,也可以作为流媒体服务器使用。这个网上有相关的资料,我就不多说了。 声明下本文用的VLC版本:2 阅读全文
posted @ 2012-09-09 12:17 Mike_Zhang 阅读(90692) 评论(21) 推荐(20)
  2012年9月7日
摘要: linux下写服务端程序免不了用到命令行参数,这里我总结下C语言、bash脚本、python和go语言中的使用方法,也方便我以后查阅。这里我主要用的是getopt这个函数,首先看看c语言中的定义。头文件:#include<unistd.h>函数定义:int getopt(int argc,char * const argv[ ],const char * optstring); extern char *optarg; extern int optind, opterr, optopt;说明: getopt函数是用来分析命令行参数的,参数argc和argv是由main()传递的参数 阅读全文
posted @ 2012-09-07 00:45 Mike_Zhang 阅读(6375) 评论(0) 推荐(3)