sipp模拟电信运营商VoIP终端测试(SIP协议调试)
三大运营商和其他众多通信业务厂商都可能有SIP服务器,用来支持语音对讲,多媒体调度等功能,他们的平台可能不是标准的SIP协议会话。
为了应对没完没了的对接各个厂商的平台,这里再整理了一套协议脚本,毕竟全都是没有意义的无用功,标准化的SIP会话就是最好的。
感谢西安的枫林晨曦,帮忙抓包,整理了这套脚本。
1、先熟悉一下SIP的各种请求方法
INVITE,ACK,BYE,CANCEL,OPTIONS,REGISTER,PRACK,SUBSCRIBE,NOTIFY,PUBLISH,INFO,REFER,MESSAGE,UPDATE
SIP request methods
https://en.wikipedia.org/wiki/List_of_SIP_request_methods
2、调试协议,少不了要抓包分析数据,手机app抓包,最简单,最靠谱的就是在电脑上装个wifi热点,让手机连上这个热点,在电脑上抓取这个wifi网卡的数据。
有的电脑网卡能模拟wifi AP,如果不支持,就买个wifi网卡吧
Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
https://www.cnblogs.com/findyou/p/3491065.html
3、各请求流程的协议脚本
不一定能直接用,一般都需要调整,因为每家都可能有差异,按照厂商给的协议文档,或者抓包信息来调整。
虽然抓包就什么都有了,但是我这里还是把运营商的信息屏蔽了,毕竟签了保密协议,免得被找茬。
不熟悉协议可以参考https://github.com/saghul/sipp-scenarios
1)regclient_set_c_port.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="regclient">
<!--本脚本特为持续性测试使用,如单次使用,建议-p 与-set c_port的端口设为相同-->
<!--执行命令样例:sipp -sf regclient_set_c_port.xml SIP_Proxy_IP:SIP_Proxy_Port -i 172.16.0.6 -p 5088 -inf callee.csv -set c_port 5088 -m 1-->
<Global variables="c_port" /> <nop hide="true">
<action>
<!--设置EXP的值为3600-->
<assignstr assign_to="EXP" value="3600" />
<assignstr assign_to="DOMAIN" value="运营商域名" />
</action>
</nop> <send>
<![CDATA[
REGISTER sip:[$DOMAIN] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=acknnkkg.[call_number]
To: <sip:[field0]@[$DOMAIN]>
Call-ID: [call_id]
CSeq: 1 REGISTER
Contact: <sip:[field0]@[local_ip]:[$c_port];line=79169130b56d431>
Max-Forwards: 70
Subject: Reg Performance Test made by wangwei
user-agent: SIPp client
Digest username="sip:[field0]@[$DOMAIN]", realm="[$DOMAIN]", uri="sip:[$DOMAIN]"
Expires: [$EXP]
Content-Length: 0
]]>
</send> <recv response="401" optional="true" auth="true" next="auth" >
</recv> <recv response="403" optional="true" next="END">
</recv> <recv response="404" optional="true" next="END">
</recv> <recv response="200" next="END" timeout="5000">
</recv> <label id="auth" />
<send>
<![CDATA[
REGISTER sip:[$DOMAIN] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
[last_From:]
[last_To:]
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[field0]@[local_ip]:[$c_port];line=79169130b56d431>
Max-Forwards: 70
Subject: Reg Performance Test made by wangwei
user-agent: SIPp client
Expires: [$EXP]
[field2]
Content-Length: 0 ]]>
</send> <recv response="200" next="END" timeout="5000">
</recv> <label id="END"/>
<nop hide="true">
</nop> <!--<Reference variables="microseconds,seconds" />--> <!-- Definition of the response time repartition table (unit is ms) -->
<ResponseTimeRepartition value="50, 200"/> <!-- Definition of the call length repartition table (unit is ms) -->
<CallLengthRepartition value="500, 5000"/> </scenario>
2)publish.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="publish_client">
<!---->
<!--执行命令样例:sipp -sf publish.xml SIP_Proxy_IP:SIP_Proxy_Port -i 172.16.0.6 -p 5088 -inf callee.csv -m 1--> <nop hide="true">
<action>
<!--设置EXP的值为3600-->
<assignstr assign_to="EXP" value="3600" />
<assignstr assign_to="DOMAIN" value="运营商域名" />
</action>
</nop> <send>
<![CDATA[
PUBLISH sip:[field0]@[$DOMAIN] SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=acknnkkg.[call_number]
To: <sip:[field0]@[$DOMAIN]>
Call-ID: [call_id]
CSeq: 2 PUBLISH
Max-Forwards: 70
User-Agent: SIPp client
Expires: [$EXP]
Event: poc-settings
Accept-Contact: 请查找运营商文档字段
Supported: 100rel,eventlist,timer,multiple-refer
Content-Type: 请查找运营商文档字段
Content-Length:[len] <?xml version="1.0" encoding="UTF-8"?>
<poc-settings xmlns="请查找运营商文档字段" xsi:schemaLocation="请查找运营商文档字段">
<entity id="sip:[field0]@[$DOMAIN]">
<isb-settings>
<incoming-session-barring active="false" />
</isb-settings>
<am-settings>
<answer-mode>automatic</answer-mode>
</am-settings>
<ipab-settings>
<incoming-personal-alert-barring active="false" />
</ipab-settings>
<sss-settings>
<simultaneous-sessions-support active="true" />
</sss-settings>
</entity>
</poc-settings>
]]>
</send> <recv response="200" next="END" timeout="5000">
</recv> <label id="END"/>
<nop hide="true">
</nop> <!--<Reference variables="microseconds,seconds" />--> <!-- Definition of the response time repartition table (unit is ms) -->
<ResponseTimeRepartition value="50, 200"/> <!-- Definition of the call length repartition table (unit is ms) -->
<CallLengthRepartition value="500, 5000"/> </scenario>
3)poc.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name="caller_with_auth"> <nop hide="true">
<action>
<!--设置EXP的值为3600-->
<assignstr assign_to="POCID" value="C127375" />
<assignstr assign_to="EXP" value="120" />
<assignstr assign_to="DOMAIN" value="运营商域名" />
</action>
</nop> <!--执行命令样例:sudo sipp -sf poc.xml SIP_Proxy_IP:SIP_Proxy_Port -i 172.16.0.6 -p 5088 -inf callee.csv -m 1 -d 60000 -oocsn ooc_default-->
<!--发送INVITE消息,设定重传定时器为1000ms,同时启动定时器invite-->
<send>
<![CDATA[
INVITE sip:[$POCID]&[field1]@[$DOMAIN];session=chat SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=4140059
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>
Call-ID:[call_id]
CSeq: 1 INVITE
Contact: <sip:[field0]@[local_ip]:[local_port]>;请查找运营商文档字段
Allow: INVITE,ACK,CANCEL,BYE,REGISTER,PRACK,PUBLISH,REFER,SUBSCRIBE,NOTIFY,MESSAGE
P-Preferred-Identity: <sip:[field0]@[$DOMAIN]>
Session-Expires: [$EXP]
Supported: replaces, 100rel, timer
Max-Forwards: 70
User-Agent: SIPp client mode
Accept-Contact: 请查找运营商文档字段
Content-Type: application/sdp
Content-Length:[len] v=0
o=SIPp [pid][call_number] 8[pid][call_number]8 IN IP[local_ip_type] [local_ip]
s=SIPp Normal Call Test
c=IN IP[media_ip_type] [media_ip]
t=0 0
m=audio [media_port] RTP/AVP 106
a=rtpmap:106 AMR/8000
a=fmtp:106 mode-set=0,1,2,3,4,5,6,7; octet-align=1
a=ptime:200
m=application 10667 UDP TBCP
a=fmtp:TBCP queuing=0; tb_priority=1; poc_sess_priority=0
]]>
</send> <!--1xx响应均为可选接收消息,且接收到临时响应后,即可停止invite定时器的计时-->
<!--收到4xx/5xx错误响应后,直接进入呼叫失败-->
<recv response="100" optional="true">
</recv> <recv response="183" optional="true" next="normal">
</recv> <recv response="403" optional="true" next="err_ack">
</recv> <recv response="480" optional="true" next="err_ack">
</recv> <recv response="486" optional="true" next="err_ack">
</recv> <recv response="500" optional="true" next="err_ack">
</recv> <recv response="503" optional="true" next="err_ack">
</recv> <recv response="180" optional="true" next="normal">
</recv> <label id="normal"/>
<!--<recv response="200">
</recv>--> <recv response="200">
</recv> <send>
<![CDATA[
ACK sip:[$POCID]&[field1]@[$DOMAIN];session=chat SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
Route: <sip:[remote_ip];lr>
From: <sip:[field0]@[$DOMAIN]>;tag=4140059
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>;tag=9500414
Call-ID: [call_id]
CSeq: 1 ACK
Contact: <sip:[field0]@[local_ip]:[local_port]>;请查找运营商文档字段
Max-Forwards: 70
User-Agent: SIPp client mode
Content-Length: 0
]]>
</send> <!--<pause hide="true" milliseconds="500"/> <send>
<![CDATA[
SUBSCRIBE sip:[$POCID]&[field1]@[$DOMAIN];session=chat SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=4628763
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>
Call-ID: [call_id]
CSeq: 2 SUBSCRIBE
Contact: <sip:[field0]@[local_ip]:[local_port]>
Max-Forwards: 70
User-Agent: SIPp client mode
Expires: [$EXP]
Event: conference
Accept-Contact:请查找运营商文档字段
Content-Length: 0
]]>
</send> <recv response="200">
</recv>--> <pause hide="true" milliseconds="500"/> <!--使用rtp_stream循环播放PCMA音频
<nop hide="true">
<action>
<exec rtp_stream="pcap/g711a.pcap,-1,0"/>
</action>
</nop>
-->
<!--使用rtp_stream循环播放PCMU音频
<nop hide="true">
<action>
<exec rtp_stream="pcap/g711u.pcap,-1,0"/>
</action>
</nop>
--> <!--使用play_pcap单次播放PCMA音频
<nop hide="true">
<action>
<exec play_pcap_audio="pcap/g711a.pcap"/>
</action>
</nop>--> <!--使用play_pcap单次播放PCMU音频
<nop hide="true">
<action>
<exec play_pcap_audio="pcap/g711u.pcap"/>
</action>
</nop>
--> <!--使用play_pcap单次播放amr音频-->
<nop hide="true">
<action>
<exec play_pcap_audio="pcap/amr.pcap"/>
</action>
</nop> <!--媒体流传输完毕后,暂停发送BYE结束呼叫,在执行命令中增加参数-d 指定暂停时间:如-d 10000暂停10秒-->
<pause /> <!--<send>
<![CDATA[
SUBSCRIBE sip:[$POCID]&[field1]@[$DOMAIN] SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=4628763
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>[peer_tag_param]
Call-ID: [call_id]
CSeq: 3 SUBSCRIBE
Contact: <sip:[field0]@[local_ip]:[local_port]>
Max-Forwards: 70
User-Agent: SIPp client mode
Accept: 请查找运营商文档字段
Expires: 0
Event: conference
Accept-Contact: 请查找运营商文档字段
Content-Length: 0
]]>
</send> <recv response="200">
</recv>--> <send start_rtd="bye">
<![CDATA[
BYE sip:[$POCID]&[field1]@[$DOMAIN];session=chat SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
Route: <sip:[remote_ip];lr>
From: <sip:[field0]@[$DOMAIN]>;tag=4140059
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>;tag=9500414
Call-ID: [call_id]
CSeq: 4 BYE
Contact: <sip:[field0]@[local_ip]:[local_port]>
Max-Forwards: 70
User-Agent: SIPp client mode
Content-Length: 0
]]>
</send> <recv response="200" rtd="bye" next="END">
</recv> <!--异常结束,复用err_ack流程-->
<label id="err_ack"/> <send>
<![CDATA[
ACK sip:[$POCID]&[field1]@[$DOMAIN];session=chat SIP/2.0
[last_Via:]
From: <sip:[field0]@[$DOMAIN]>;tag=[call_number]zhg8
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>[peer_tag_param]
[last_Call-ID:]
CSeq: 1 ACK
Contact: <sip:[field0]@[local_ip]:[local_port]>;请查找运营商文档字段
Max-Forwards: 70
User-Agent: SIPp client mode
Content-Length: 0
]]>
</send> <!--正常结束-->
<label id="END"/>
<nop hide="true">
</nop> <!--如果存在定义了但未被使用的变量,可以在下面语句的双引号中增加,避免运行时报错
<Reference variables="junk,callee_media_port" />--> <!--definition of the response time repartition table (unit is ms) -->
<ResponseTimeRepartition value="50, 200,1000,2000,4000,10000"/> <!--definition of the call length repartition table (unit is ms) -->
<CallLengthRepartition value="500, 1000, 10000"/> </scenario>
4) subscribe.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name="subscribe">
<Global variables="c_port" /> <!--执行命令样例:sipp -sf subscribe.xml SIP_Proxy_IP:SIP_Proxy_Port -i 172.16.0.6 -p 5077 -set c_port 5088 -inf callee.csv -m 1 -d 40000--> <nop hide="true">
<action>
<!--设置EXP的值为3600-->
<assignstr assign_to="POCID" value="C127375" />
<assignstr assign_to="EXP" value="120" />
<assignstr assign_to="DOMAIN" value="运营商域名" />
</action>
</nop> <send>
<![CDATA[
SUBSCRIBE sip:[$POCID]&[field1]@[$DOMAIN];session=chat SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=4629583
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>
Call-ID: [call_id]
CSeq: 2 SUBSCRIBE
Contact: <sip:[field0]@[local_ip]:[$c_port]>
Max-Forwards: 70
User-Agent: SIPp client mode
Expires: [$EXP]
Event: conference
Accept-Contact: 请查找运营商文档字段
Content-Length: 0
]]>
</send> <recv response="200">
</recv> <pause /> <send>
<![CDATA[
SUBSCRIBE sip:[$POCID]&[field1]@[$DOMAIN] SIP/2.0
Via: SIP/2.0/UDP [local_ip]:[local_port];rport;branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=4629583
To: <sip:[$POCID]&[field1]@[$DOMAIN];session=chat>[peer_tag_param]
Call-ID: [call_id]
CSeq: 3 SUBSCRIBE
Contact: <sip:[field0]@[local_ip]:[$c_port]>
Max-Forwards: 70
User-Agent: SIPp client mode
Accept: 请查找运营商文档字段
Expires: 0
Event: conference
Accept-Contact: 请查找运营商文档字段
Content-Length: 0
]]>
</send> <recv response="200">
</recv> <!--正常结束-->
<label id="END"/>
<nop hide="true">
</nop> <!--如果存在定义了但未被使用的变量,可以在下面语句的双引号中增加,避免运行时报错
<Reference variables="junk,callee_media_port" />--> <!--definition of the response time repartition table (unit is ms) -->
<ResponseTimeRepartition value="50, 200,1000,2000,4000,10000"/> <!--definition of the call length repartition table (unit is ms) -->
<CallLengthRepartition value="500, 1000, 10000"/> </scenario>
5) sip里的rtcp操作, 抢占讲话权限
https://wenku.baidu.com/view/854dd3e55ef7ba0d4a733bed.html
TBCP 消息简要概述
https://blog.csdn.net/wunderup/article/details/5136441
6) deregclient_set_c_port.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="regclient">
<!--本脚本特为持续性测试使用,如单次使用,建议-p 与-set c_port的端口设为相同-->
<!--执行命令样例:sipp -sf deregclient_set_c_port.xml SIP_Proxy_IP:SIP_Proxy_Port -i 172.16.0.6 -p 5088 -inf callee.csv -set c_port 5088 -m 1-->
<Global variables="c_port" /> <nop hide="true">
<action>
<!--设置EXP的值为3600-->
<assignstr assign_to="EXP" value="0" />
<assignstr assign_to="DOMAIN" value="运营商域名" />
</action>
</nop> <send>
<![CDATA[
REGISTER sip:[$DOMAIN] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[$DOMAIN]>;tag=acknnkkg.[call_number]
To: <sip:[field0]@[$DOMAIN]>
Call-ID: [call_id]
CSeq: 1 REGISTER
Contact: <sip:[field0]@[local_ip]:[$c_port];line=79169130b56d431>
Max-Forwards: 70
Subject: Reg Performance Test made by wangwei
user-agent: SIPp client
Digest username="sip:[field0]@[$DOMAIN]", realm="[$DOMAIN]", uri="sip:[$DOMAIN]"
Expires: [$EXP]
Content-Length: 0
]]>
</send> <recv response="401" optional="true" auth="true" next="auth" >
</recv> <recv response="403" optional="true" next="END">
</recv> <recv response="404" optional="true" next="END">
</recv> <recv response="200" next="END" timeout="5000">
</recv> <label id="auth" />
<send>
<![CDATA[
REGISTER sip:[$DOMAIN] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
[last_From:]
[last_To:]
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[field0]@[local_ip]:[$c_port];line=79169130b56d431>
Max-Forwards: 70
Subject: Reg Performance Test made by wangwei
user-agent: SIPp client
Expires: [$EXP]
[field2]
Content-Length: 0 ]]>
</send> <recv response="200" next="END" timeout="5000">
</recv> <label id="END"/>
<nop hide="true">
</nop> <!--<Reference variables="microseconds,seconds" />--> <!-- Definition of the response time repartition table (unit is ms) -->
<ResponseTimeRepartition value="50, 200"/> <!-- Definition of the call length repartition table (unit is ms) -->
<CallLengthRepartition value="500, 5000"/> </scenario>
4、sipp xml正则表达式获取接收的信息
<recv response="200">
<action>
<ereg regexp="\r\n\r\n(.*)" search_in="msg" assign_to="sdp_info" />
<!--
<ereg regexp=".*" search_in="msg" body="" assign_to="1" />
<ereg regexp=".*" search_in="hdr" header="CSeq:" check_it="true" assign_to="2" />
<exec command="echo [$1] >> from_list.log"/>-->
<exec command="echo '[$sdp_info]' >> from_list.log"/>
</action>
</recv>
sipp模拟电信运营商VoIP终端测试(SIP协议调试)的更多相关文章
- sipp模拟freepbx分机测试(SIP协议调试)
1.sipp的安装 1) 在centos 7.2下安装 yum install make gcc gcc-c++ ncurses ncurses.x86_64 ncurses-devel ncurse ...
- sipp模拟freeswitch分机测试(SIP协议调试)
1.freeswitch安装 1) 网上很多安装方法都不靠谱,系统版本,各种依赖库一堆问题,下面是验证的可行的. yum install -y http://files.freeswitch.org/ ...
- [转]用Whois获得电信运营商的IP地址是如何分配的?
[转]用Whois获得电信运营商的IP地址是如何分配的? Linux下获得一些中国电信运营商的IP地址分配情况: APNIC是管理亚太地区IP地址分配的机构,它有着丰富准确的IP地址分配库,同时这些信 ...
- 电信运营商 IT 系统介绍
业务支撑系统 BSS: Business support system 运营支撑系统 OSS: Operation support system 管理支撑系统 MSS: Management Su ...
- WordPress显示评论者IP归属地、浏览器、终端设备、电信运营商
在网上查资料闲逛,偶然间看到了张戈博客的评论框有点意思,于是就收走拿到了我的米扑博客. 本文为米扑博客原创:总结分享 WordPress显示评论者IP归属地.浏览器.终端设备.电信运营商 WordPr ...
- 某欧洲电信运营商OSS功能架构
- 运营商DNS系统安全解决方案
DNS系统面临的主要风险 目前,DNS面临的安全问题主要可以分为三类:DNS欺骗攻击.拒绝服务攻击.系统漏洞,下文将分别进行介绍. DNS欺骗攻击 当一个DNS服务器遭到欺骗攻击,使用了来自一个恶 ...
- 100.64.0.0/10运营商级(Carrier-grade)NAT保留IP地址
在一次跟踪路由的网络操作时发现自己路由器下一跳路由节点的IP地址比较奇怪,是100.64.0.1.好奇促使我查询了这个IP地址的归属,结果是保留地址,到这里觉得比较奇怪了,按照常理以IPv4为例保留的 ...
- SDN/NFV运营商商业化部署
三大运营商发布未来网络架构,并逐步加快SDN/NFV商业化部署的步伐.中国联通发布其新一代网络架构<CUBE-Net 2.0白皮书>,并与20多家合作伙伴共同启动了“新一代网络”合作研发计 ...
随机推荐
- JS 数组以及对象的深拷贝总结
javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 前言 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示: 如上,arr的修改,会影响arr2的值,这 ...
- httpoxy 漏洞预警及修复方案
影响范围 PHP.Go.Python等开启CGI(Client)模式的脚本语言 Language 环境依赖 HTTP Client PHP php-fpmmod_php Guzzle 4+Artax ...
- 003杰信-在jsp页面输入数据,然后在oracle数据库中插入factory数据,当字段允许为空时要特殊处理
本博客的内容全部来自于传智播客,特在此说明. 业务要求如下:在jsp页面(jFactoryCreate.jsp)上输入数据时,转到后台,并输入到数据库. jFactoryCreate.jsp页面:
- Android 绘制圆环
使用画圆弧的方式绘制圆环和进度条,使用sweepGradient进行渐变. 参考链接 http://blog.csdn.net/u011494050/article/details/39251239 ...
- how to use novaclient python api
ref: http://docs.openstack.org/developer/python-novaclient/api.html
- CSS代码重构与优化
CSS代码重构的基本方法 前面说到了CSS代码重构的目的,现在我们来说说一些如何达到这些目的的一些基本方法,这些方法都是易于理解,容易实施的一些手段,大家平时可能也不知不觉地在使用它. 提高CSS性能 ...
- 安装wampserver时提示丢失MSVCR110.dll
安装Wampserver 2后启动的时候提示系统错误:MSVCR110.dll丢失. 在wampserver官网上有例如以下提示: 于是卸载原来的WAMPSERVER 2 ,在http://www.m ...
- 复习及总结--.Net线程篇(1)
老是没耐心写这些东西,最近想想也工作两年了,该对自己的东西做个整理了,不知道这次能坚持写几篇,总得来说尽量督促自己吧 言归正传,.net中的多线程主要可以使用两种方法进行调用 1,异步调用 2,Thr ...
- GSAP 官方文档(结贴)
好久没写GSAP的教程的(其实我也不懂哈哈),国内也没什么人用,不对动画要求特别高的话,其实也没必要用GSAP,现在工作上没用到这个东西,也懒得写了,所以有问题的话去找一下greensock的官方文档 ...
- 开发环境eclipse for Mac 下的常用快捷键汇总(基本参照Win系,将Ctrl换为Command)
最近迁移开发环境到Mac下,在豆瓣看到一个常用快捷键,去掉废话直接上干货 Command + O:显示大纲 Command + 1:快速修复 Command + D:删除当前行 Command + O ...