osip及eXosip的编译方法

在最新版本的osip2、exosip2中不支持在VC6.0下编译osip、exosip协议栈的方法

说明:
1.以下文章中的osip版本为3.1.0
2.eXosip版本为3.1.0
3.编译环境为:Windows XP 专业版本+VS 2005
4.实例程序下载:http://download.csdn.net/source/617797
5.osip、exosip、openssl的开发包下载,开发包包括:osip2.dll、osipparser2.dll、exosip2.dll、libeay32.dll、ssleay32.dll和相对应的lib文件,下载地址同上

第一步,下载:
http://download.savannah.gnu.org/releases/osip/libosip2-3.1.0.tar.gz
下载最新的osip库并解压
http://download.savannah.gnu.org/releases/exosip/libeXosip2-3.1.0.tar.gz
下载最新的eXsoip库并解压
第二步,编译osip3.1.0:
1.用VS2005打开libosip2-3.1.0/platform/vsnet/osip.sln
2.对osip2和osipparser2项目生成Release DLL
3.其生成的LIB/DLL 位于:libosip2-3.1.0/platform/vsnet/Release DLL/下
4.如果有出现外部变量找不到的情况,很有可能是生成的dll没有实现该函数,在def文件中删除找不到的外部变量就好了
第三步,编译eXosip3.1.0:
1.用VS2005打开libeXosip2-3.1/platform/vsnet/eXosip.sln
2.将libosip2-3.1/include/osip2目录COPY到libeXosip2-3.1/include/下
3.将libosip2-3.1/include/osipparser2目录COPY到libeXosip2-3.1/include/下
4.在libeXosip2-3.1目录下新建lib目录
5.将“第二步”中生成的libosip2-3.1/platform/vsnet/Release DLL/osip2.lib文件COPY到libeXosip2-3.1/lib目录下
6.将“第二步”中生成的libosip2-3.1/platform/vsnet/Release DLL/osipparser2.lib文件COPY到libeXosip2-3.1/lib目录下
7.修改项目属性,新增Dnsapi.lib Iphlpapi.lib Ws2_32.lib osip2.lib osipparser2.lib库输入
8.修改项目属性,新增库目录../../lib
9.修改项目的输出为.DLL,默认为.lib
10.编译Relase DLL
11.其生成的LIB/DLL 位于:libeXosip2-3.1/platform/vsnet/Release/下

注意:

在eXoSip.def 中添加下面函数的导出,不知道是为什么 这些函数没有导出!
     eXosip_call_set_reference
    eXosip_call_build_initial_invite
    eXosip_call_send_initial_invite
    eXosip_call_build_request
    eXosip_call_build_ack
    eXosip_call_send_ack
    eXosip_call_build_refer
    eXosip_call_build_info
    eXosip_call_build_options
    eXosip_call_build_update
    eXosip_call_build_notify
    eXosip_call_send_request
    eXosip_call_build_answer
    eXosip_call_send_answer
    eXosip_call_terminate
    eXosip_call_build_prack
    eXosip_call_send_prack
    eXosip_call_get_referto
    eXosip_call_find_by_replaces

编译osip可能会出现如下错误:

1:在osipparser.dll的def文件会出现几个拼写错误,如缺少MD5_****的函数前面缺少osip_,使得连接器出现link2019错误,解决方法是在前面加上osip_

2:但是如果在编译的时候出现错误:

libnet_prand.obj : error LNK2001: unresolved external symbol __imp__CryptReleaseContext@8
libnet_prand.obj : error LNK2001: unresolved external symbol __imp__CryptGenRandom@12
libnet_prand.obj : error LNK2001: unresolved external symbol __imp__CryptAcquireContextA@20
Debug/Libnet.dll : fatal error LNK1120: 3 unresolved externals

仔细看了下,CryptReleaseContext等这三个函数不是从advapi32.lib里导入的么?难道要加上advapi32.lib库?在项目设置的连接里把advapi32.lib加上,然后rebuil all,果然成功。

如果出现是__RTC_CheckEsp这个外部变量无法解析,很大可能是两个项目的配置不一样,比如说一个能从父项目继承什么。另外一个没有设置,就会出现这个问题。

编译eXosip可能会出现的问题:

要包含头文件:ssleay32.lib libeay32.lib Dnsapi.lib Iphlpapi.lib Ws2_32.lib osip2.lib osipparser2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ,其中ssleay32.lib libeay32.lib是openssl的静态库。

可能还会找不到一些无法解析的外部变量,可能是在osip的输出dll的def文件中没有加上

osip_transaction_set_srv_record     @122

然后重新编译osip

外部变量问题,一般都是库文件的问题,记住要把库文件放在工程目录lib目录下(没有lib目录自己新建一个) 然后在工具->项目->c/c++->C++目录下把设置../../lib设置成包含的目录

其中ssleay32.lib libeay32.lib是openssl编译形成的静态链接库,可以从网上下载,或者自己编译

之外,尤其大家下载的源代码由于认为的或者是编译环境的不同,容易造成多种错误,我还碰到了个无法解析的Osip_^^^!!#@!@#!函数无法解析的情况,在osip中的def文件一查,果然缺少个122的函数文件输出声明,加进去重新编译osip,成功,在编译eXosip成功!

最后运行实例,进行项目配置:

osip及eXosip的开发方法:
将以下程序作为UAS.CPP保存

  1. // UAS.cpp : 定义控制台应用程序的入口点。
  2. //
  3. # include <eXosip2/eXosip.h>
  4. # include <stdio.h>
  5. # include <stdlib.h>
  6. # include <Winsock2.h>
  7.  
  8. /*
  9. # include <netinet/in.h>
  10. # include <sys/socket.h>
  11. # include <sys/types.h>
  12. */
  13.  
  14. #pragma comment(lib, "osip2.lib")
  15. #pragma comment(lib, "osipparser2.lib")
  16. #pragma comment(lib, "eXosip.lib")
  17. #pragma comment(lib, "Iphlpapi.lib")
  18. #pragma comment(lib, "Dnsapi.lib")
  19. #pragma comment(lib, "ws2_32.lib")
  20.  
  21. int main (int argc, char *argv[])
  22. {
  23.  
  24. eXosip_event_t *je = NULL;
  25. osip_message_t *ack = NULL;
  26. osip_message_t *invite = NULL;
  27. osip_message_t *answer = NULL;
  28. sdp_message_t *remote_sdp = NULL;
  29. int call_id, dialog_id;
  30. int i,j;
  31. int id;
  32.  
  33. char *sour_call = "sip:24@10.16.79.24";
  34. char *dest_call = "sip:24@10.16.79.24:5061";//client ip
  35.  
  36. char command;
  37. char tmp[];
  38. char localip[];
  39. int pos = ;
  40.  
  41. //初始化sip
  42. i = eXosip_init ();
  43. if (i != )
  44. {
  45. printf ("Can't initialize eXosip!/n");
  46. return -;
  47. }
  48. else
  49. {
  50. printf ("eXosip_init successfully!/n");
  51. }
  52.  
  53. i = eXosip_listen_addr (IPPROTO_UDP, NULL, , AF_INET, );
  54. if (i != )
  55. {
  56. eXosip_quit ();
  57. fprintf (stderr, "eXosip_listen_addr error!/nCouldn't initialize transport layer!/n");
  58. }
  59.  
  60. for(;;)
  61. {
  62. //侦听是否有消息到来
  63. je = eXosip_event_wait (,);
  64.  
  65. //协议栈带有此语句,具体作用未知
  66.  
  67. eXosip_lock ();
  68. eXosip_default_action (je);
  69. eXosip_automatic_refresh ();
  70. eXosip_unlock ();
  71.  
  72. if (je == NULL)//没有接收到消息
  73. continue;
  74.  
  75. // printf ("the cid is %s, did is %s/n", je->did, je->cid);
  76.  
  77. switch (je->type)
  78. {
  79. case EXOSIP_MESSAGE_NEW://新的消息到来
  80. printf (" EXOSIP_MESSAGE_NEW!/n");
  81. if (MSG_IS_MESSAGE (je->request))//如果接受到的消息类型是MESSAGE
  82. {
  83. osip_body_t *body;
  84. osip_message_get_body (je->request, , &body);
  85. printf ("I get the msg is: %s/n", body->body);
  86. //printf ("the cid is %s, did is %s/n", je->did, je->cid);
  87.  
  88. //按照规则,需要回复OK信息
  89. eXosip_message_build_answer (je->tid, ,&answer);
  90. eXosip_message_send_answer (je->tid, ,answer);
  91. }
  92. break;
  93.  
  94. case EXOSIP_CALL_INVITE:
  95. //得到接收到消息的具体信息
  96. printf ("Received a INVITE msg from %s:%s, UserName is %s, password is %s/n",
  97. je->request->req_uri->host,
  98. je->request->req_uri->port,
  99. je->request->req_uri->username,
  100. je->request->req_uri->password);
  101.  
  102. //得到消息体,认为该消息就是SDP格式.
  103. remote_sdp = eXosip_get_remote_sdp (je->did);
  104. call_id = je->cid;
  105. dialog_id = je->did;
  106.  
  107. eXosip_lock ();
  108. eXosip_call_send_answer (je->tid, , NULL);
  109.  
  110. i = eXosip_call_build_answer (je->tid, , &answer);
  111. if (i != )
  112. {
  113. printf ("This request msg is invalid!Cann't response!/n");
  114. eXosip_call_send_answer (je->tid, , NULL);
  115. }
  116. else
  117. {
  118. snprintf (tmp, ,
  119. "v=0/r/n"
  120. "o=anonymous 0 0 IN IP4 0.0.0.0/r/n"
  121. "t=1 10/r/n"
  122. "a=username:rainfish/r/n"
  123. "a=password:123/r/n");
  124.  
  125. /*设置回复的SDP消息体,下一步计划分析消息体
  126. 没有分析消息体,直接回复原来的消息,
  127. 这一块做的不好。
  128. */
  129. osip_message_set_body (answer, tmp, strlen(tmp));
  130. osip_message_set_content_type (answer, "application/sdp");
  131. eXosip_call_send_answer (je->tid, , answer);
  132. printf ("send 200 over!/n");
  133. }
  134. eXosip_unlock ();
  135.  
  136. //显示出在sdp消息体中的attribute 的内容,里面计划存放我们的信息
  137. printf ("the INFO is :/n");
  138.  
  139. while (!osip_list_eol ( &(remote_sdp->a_attributes), pos))
  140. {
  141. sdp_attribute_t *at;
  142.  
  143. at = (sdp_attribute_t *) osip_list_get ( &remote_sdp->a_attributes, pos);
  144. printf ("%s : %s/n", at->a_att_field, at->a_att_value);
  145. //这里解释了为什么在SDP消息体中属性a里面存放必须是两列
  146.  
  147. pos ++;
  148. }
  149. break;
  150.  
  151. case EXOSIP_CALL_ACK:
  152. printf ("ACK recieved!/n");
  153. // printf ("the cid is %s, did is %s/n", je->did, je->cid);
  154. break;
  155.  
  156. case EXOSIP_CALL_CLOSED:
  157. printf ("the remote hold the session!/n");
  158. // eXosip_call_build_ack(dialog_id, &ack);
  159. //eXosip_call_send_ack(dialog_id, ack);
  160.  
  161. i = eXosip_call_build_answer (je->tid, , &answer);
  162. if (i != )
  163. {
  164. printf ("This request msg is invalid!Cann't response!/n");
  165. eXosip_call_send_answer (je->tid, , NULL);
  166. }
  167. else
  168. {
  169. eXosip_call_send_answer (je->tid, , answer);
  170. printf ("bye send 200 over!/n");
  171. }
  172.  
  173. break;
  174.  
  175. case EXOSIP_CALL_MESSAGE_NEW:
  176. /*至于该类型和EXOSIP_MESSAGE_NEW的区别,源代码这么解释的
  177. request related events within calls (except INVITE)
  178. EXOSIP_CALL_MESSAGE_NEW, < announce new incoming request. response received for request outside calls
  179. EXOSIP_MESSAGE_NEW, < announce new incoming request.
  180. 我也不是很明白,理解是:
  181. EXOSIP_CALL_MESSAGE_NEW是一个呼叫中的新的消息到来,
  182. 比如ring trying都算, 所以在接受到后必须判断 该消息类型,
  183. EXOSIP_MESSAGE_NEW而是表示不是呼叫内的消息到来。
  184. 该解释有不妥地方,仅供参考。
  185. */
  186. printf(" EXOSIP_CALL_MESSAGE_NEW/n");
  187.  
  188. if (MSG_IS_INFO(je->request) ) //如果传输的是INFO方法
  189. {
  190. eXosip_lock ();
  191. i = eXosip_call_build_answer (je->tid, , &answer);
  192. if (i == )
  193. {
  194. eXosip_call_send_answer (je->tid, , answer);
  195. }
  196. eXosip_unlock ();
  197. {
  198. osip_body_t *body;
  199. osip_message_get_body (je->request, , &body);
  200. printf ("the body is %s/n", body->body);
  201. }
  202. }
  203. break;
  204.  
  205. default:
  206. printf ("Could not parse the msg!/n");
  207. break;
  208. }
  209. }
  210. }

将以下程序作为UAC.CPP保存

  1. // UAC.cpp : 定义控制台应用程序的入口点。
  2. //
  3. # include <eXosip2/eXosip.h>
  4. # include <stdio.h>
  5. # include <stdlib.h>
  6. # include <Winsock2.h>
  7.  
  8. /*
  9. #i nclude <netinet/in.h>
  10. #i nclude <sys/socket.h>
  11. #i nclude <sys/types.h>
  12. */
  13.  
  14. #pragma comment(lib, "osip2.lib")
  15. #pragma comment(lib, "osipparser2.lib")
  16. #pragma comment(lib, "eXosip.lib")
  17. #pragma comment(lib, "Iphlpapi.lib")
  18. #pragma comment(lib, "Dnsapi.lib")
  19. #pragma comment(lib, "ws2_32.lib")
  20.  
  21. int main (int argc, char *argv[])
  22. {
  23. eXosip_event_t *je;
  24. osip_message_t *reg = NULL;
  25. osip_message_t *invite = NULL;
  26. osip_message_t *ack = NULL;
  27. osip_message_t *info = NULL;
  28. osip_message_t *message = NULL;
  29.  
  30. int call_id, dialog_id;
  31. int i,flag;
  32. int flag1 = ;
  33. int id;
  34.  
  35. char *identity = "sip:24@10.16.79.24";
  36. char *registerer = "sip:10.16.79.24:5060";//server ip
  37. char *source_call = "sip:24@10.16.79.24";
  38. char *dest_call = "sip:24@10.16.79.24:5060";//server ip
  39.  
  40. char command;
  41. char tmp[];
  42. char localip[];
  43.  
  44. printf("r 向服务器注册/n/n");
  45. printf("c 取消注册/n/n");
  46. printf("i 发起呼叫请求/n/n");
  47. printf("h 挂断/n/n");
  48. printf("q 退出程序/n/n");
  49. printf("s 执行方法INFO/n/n");
  50. printf("m 执行方法MESSAGE/n/n");
  51.  
  52. //初始化
  53. i = eXosip_init ();
  54. if (i != )
  55. {
  56. printf ("Couldn't initialize eXosip!/n");
  57. return -;
  58. }
  59. else
  60. {
  61. printf ("eXosip_init successfully!/n");
  62. }
  63.  
  64. i = eXosip_listen_addr (IPPROTO_UDP, NULL, , AF_INET, );
  65. if (i != )
  66. {
  67. eXosip_quit ();
  68. fprintf (stderr, "Couldn't initialize transport layer!/n");
  69. return -;
  70. }
  71.  
  72. flag = ;
  73.  
  74. while (flag)
  75. {
  76. printf ("please input the comand:/n");
  77.  
  78. scanf ("%c", &command);
  79. getchar ();
  80.  
  81. switch (command)
  82. {
  83. case 'r':
  84. printf ("This modal isn't commpleted!/n");
  85. break;
  86.  
  87. case 'i':/* INVITE */
  88. i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "This si a call for a conversation");
  89. if (i != )
  90. {
  91. printf ("Intial INVITE failed!/n");
  92. break;
  93. }
  94. /*符合SDP格式,其中属性a是自定义格式,
  95. 也就是说可以存放自己的信息,
  96. 但是只能是两列,比如帐户信息
  97. 但是经测试,格式:v o t必不可少,原因未知,
  98. 估计是协议栈在传输时需要检查的
  99. */
  100. snprintf (tmp, ,
  101. "v=0/r/n"
  102. "o=anonymous 0 0 IN IP4 0.0.0.0/r/n"
  103. "t=1 10/r/n"
  104. "a=username:rainfish/r/n"
  105. "a=password:123/r/n");
  106. osip_message_set_body (invite, tmp, strlen(tmp));
  107. osip_message_set_content_type (invite, "application/sdp");
  108.  
  109. eXosip_lock ();
  110. i = eXosip_call_send_initial_invite (invite);
  111. eXosip_unlock ();
  112.  
  113. flag1 = ;
  114. while (flag1)
  115. {
  116. je = eXosip_event_wait (, );
  117. if (je == NULL)
  118. {
  119. printf ("No response or the time is over!/n");
  120. break;
  121. }
  122.  
  123. switch (je->type)
  124. {
  125. case EXOSIP_CALL_INVITE:
  126. printf ("a new invite reveived!/n");
  127. break;
  128.  
  129. case EXOSIP_CALL_PROCEEDING:
  130. printf ("proceeding!/n");
  131. break;
  132.  
  133. case EXOSIP_CALL_RINGING:
  134. printf ("ringing!/n");
  135. // call_id = je->cid;
  136. // dialog_id = je->did;
  137. printf ("call_id is %d, dialog_id is %d /n", je->cid, je->did);
  138. break;
  139.  
  140. case EXOSIP_CALL_ANSWERED:
  141. printf ("ok! connected!/n");
  142. call_id = je->cid;
  143. dialog_id = je->did;
  144. printf ("call_id is %d, dialog_id is %d /n", je->cid, je->did);
  145. eXosip_call_build_ack (je->did, &ack);
  146. eXosip_call_send_ack (je->did, ack);
  147. flag1 = ;
  148. break;
  149.  
  150. case EXOSIP_CALL_CLOSED:
  151. printf ("the other sid closed!/n");
  152. break;
  153.  
  154. case EXOSIP_CALL_ACK:
  155. printf ("ACK received!/n");
  156. break;
  157.  
  158. default:
  159. printf ("other response!/n");
  160. break;
  161. }
  162.  
  163. eXosip_event_free (je);
  164. }
  165. break;
  166.  
  167. case 'h':
  168. printf ("Holded !/n");
  169.  
  170. eXosip_lock ();
  171. eXosip_call_terminate (call_id, dialog_id);
  172. eXosip_unlock ();
  173. break;
  174.  
  175. case 'c':
  176. printf ("This modal isn't commpleted!/n");
  177. break;
  178.  
  179. case 's': //传输INFO方法
  180. eXosip_call_build_info (dialog_id, &info);
  181. snprintf (tmp, , "hello,rainfish");
  182. osip_message_set_body (info, tmp, strlen(tmp));
  183.  
  184. //格式可以任意设定,text/plain代表文本信息
  185. osip_message_set_content_type (info, "text/plain");
  186. eXosip_call_send_request (dialog_id, info);
  187. break;
  188.  
  189. case 'm':
  190. /*传输MESSAGE方法,也就是即时消息,
  191. 和INFO方法相比,我认为主要区别,
  192. 是MESSAGE不用建立连接,直接传输信息,
  193. 而INFO必须在建立INVITE的基础上传输。
  194. */
  195. printf ("the mothed :MESSAGE/n");
  196. eXosip_message_build_request (&message, "MESSAGE", dest_call, source_call, NULL);
  197.  
  198. snprintf (tmp, , "hellor rainfish");
  199. osip_message_set_body (message, tmp, strlen(tmp));
  200. //假设格式是xml
  201. osip_message_set_content_type (message, "text/xml");
  202. eXosip_message_send_request (message);
  203. break;
  204.  
  205. case 'q':
  206. eXosip_quit ();
  207. printf ("Exit the setup!/n");
  208. flag = ;
  209. break;
  210. }
  211. }
  212. return ();
  213. }

osip及eXosip的编译方法的更多相关文章

  1. Genome2D编译方法

    Genome2D是一个高效的2D引擎,现在支持Flash(stage3d)和HTML5,因为只有作者一个人在维护,就没开源代码. 最近和作者沟通了下,已经开源啦. 作者划分了几个模块,编译起来不是特别 ...

  2. Spark-1.0.1 的make-distribution.sh编译、SBT编译、Maven编译 三种编译方法

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3775343.html 本文编译方法所支持的hadoop环境是Hadoop-2.2.0, ...

  3. 详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法

    详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法 一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src- ...

  4. (DT系列一)DTS结构及其编译方法

    DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 3,dts是如何被编译的,以及编译后会生成一个什么文件. 二:参考文字 1,DTS(device tre ...

  5. 【转】(DT系列一)DTS结构及其编译方法----不错

    原文网址:http://www.cnblogs.com/biglucky/p/4057476.html DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 ...

  6. 简单的Android之apk包反编译方法

    网上相关的文章一大堆了,我只是总结下自己的反编译方法和工具 工具下载地址: http://download.csdn.net/detail/zsjangel/7104663 下载上面的三个工具的压缩包 ...

  7. sass学习笔记 -- sass的四种编译方法

    sass的四种编译方法:(.scss) (一)ruby下的命令行编译 首先需要安装ruby,注意需勾选Add Ruby executables to your PATH选项,以添加环境变量. ruby ...

  8. (转)wxWidgets 2.9.2svn(3.x)最小体积编译方法

    官方论坛.网上记录的wxWidgets编译方法,会导致编译后的程序库非常大,原因在于对编译的方法选择不当.下面简单总结一下如何编译最新的SVN代码.下载最新源码(每日构建):http://biolpc ...

  9. Hadoop编译方法

    伪分布式: hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml 1.在hadoop官网下载hadoop的源码(同步跟踪最新源代码) mv ...

随机推荐

  1. Java虚拟机内存优化实践

    前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提到内存,就不得不说到内存泄露.众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java ...

  2. Java实现生命周期管理机制

    先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然 ...

  3. css样式:列表

    css code: /*系统自带的*/ ul li{ list-style-style: disc; } /*自定义图标*/ ul li{ list-style-image: url("im ...

  4. 今天在写powershell脚本中犯的两个错误

    可能是因为牙痛没睡好,今天老是犯错,还是脚本写错,特别难调. 第一个错误: powershell脚本里面,函数与函数互相调用的传参.其实就像调用普通的cmdlet一样的写法,应该这么写: Add-Sc ...

  5. sqlite3经常使用命令&amp;语法

    http://blog.csdn.net/linchunhua/article/details/7184439 sqlite数据库仅仅用一个文件就ok,小巧方便,所以是一个很不错的嵌入式数据库,SQL ...

  6. 开发专题指南: JEECG高速微云开发平台前言

    JEECG微云高速开发平台-前言 1. 前言 1.1. 技术背景 随着WEB UI 框架(EasyUI/Jquery UI/Ext/DWZ)等的逐渐成熟,系统界面逐渐实现统一化,代码生成器也能够生成统 ...

  7. 金典 SQL笔记(4)

    由于在本地笔记上写的.CSDN markdown编辑器仅仅支持.md格式导入, 图片没办法直接导进去.写的多了懒的一张一张图片切图上传; 直接整个文章切成图片上传上去了. watermark/2/te ...

  8. 菜鸟玩云计算之十六:Ubuntu14.04上创建的虚拟机迁移到RHEL6.4

    菜鸟玩云计算之十六:Ubuntu14.04上创建的RHEL6.4虚拟机迁移到RHEL6.4主机上 RHEL6.4 Server作为虚拟机的HOST,执行以下的命令检查配置和安装相关软件: # egre ...

  9. FoxOne---一个快速高效的BS框架--(4)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  10. 广播接收者 BroadcastReceiver 示例-2

    BaseActivity /**所有Activity的基类*/ public class BaseActivity extends Activity {     @Override     prote ...