Archive for 四月, 2013

C++网络安全工具编程(二)Web目录扫描器

星期二, 四月 30th, 2013 136 views

我们知道对目标网站的访问是基于Http协议的,而Http又是基于TCPsocket连接的,所以本例中将会使用到上一节中的部分代码,即关于C++最简socket连接建立的Demo。
建立socket连接的过程请参考《C++网络安全工具编程(一)connect端口扫描器》中的基础部分。

当成功与目标服务器的80端口(即http服务端口)建立连接后,我们即可通过发送请求和接收消息来与目标网站服务器进行信息交互,大部分浏览器的实现也是基于此原理。

那么,应该怎样与目标网页服务器进行交互呢。这里我们需要先了解一下Http报文。

先来看下Http请求报文


(图来自网络)
(更多…)

C++网络安全工具编程(一)connect端口扫描器

星期日, 四月 28th, 2013 169 views

端口扫描的种类有很多,其中最简单的即为基于TCP三次握手协议的connect扫描器。其原理为与服务端口建立一个socket连接,当连接上时即可判断端口打开,之后断开连接,进行下一端口的试探。

首先来看一个最简的c++客户端与目标服务器建立socket连接的基础代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include <string .h>
#include <winsock .h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    //初始化Windows Sockets 动态库

    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
        cout< <"找不到可使用的WinSock dll!"<<endl;
        return 1;
    }

    //创建套接字
    SOCKET sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sClient==INVALID_SOCKET)
    {
        cout<<"创建客户端socket失败!"<<endl;
        return 1;
    }
    //连接服务器
    SOCKADDR_IN addrServ;
    addrServ.sin_family=AF_INET;
    addrServ.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrServ.sin_port=htons(10046);

    if(connect(sClient,(sockaddr *)&addrServ,sizeof(sockaddr))==SOCKET_ERROR)
    {
        cout<<"连接服务器失败!"<<endl;
        closesocket(sClient);
        return 1;
    }
    else
        cout<<"连接服务器成功!"<<endl;
   
    //关闭套接字,释放资源
    closesocket(sClient);
    WSACleanup();

    return 0;

(更多…)

Android触摸事件及触摸屏滑动在游戏视角中的应用

星期二, 四月 23rd, 2013 131 views

Android触摸事件是建立于Ontuch事件相应机制上的,首先我们需要为Activity窗体添加一个OnTouchListener,实现OnTouchListener接口即可

1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends Activity implements OnTouchListener {

Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                button = (Button) findViewById(R.id.button1);
                button.setOnTouchListener(this);
    }
}

(更多…)

C++ for Arduino EventTimer(事件定时器)循环队列

星期六, 四月 20th, 2013 578 views

我们知道在Arduino中是没有线程这个概念的,如果需要同时按照时间间隔执行多个事件,使用系统自带的delay()进行阻塞势必会影响到后面的事件。例如在loop()中我们需要不间断的向电机发送脉冲信号使之行走,同时每间隔1s向控制端发送一次数据。如果采用delay(1000)的方法,电机则会每隔1s才获得一次脉冲信号,这不是我们想要的。所以,我们需要为此自定义一个事件定时器。

事件定时器类的C++代码如下:
EventTimer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
#include "Arduino.h"
typedef void (*LPFUNC)();//typedef定义一个函数指针
class EventTimer
{
public:
    EventTimer(void);
    ~EventTimer(void);
    void Init();//初始化
    void Looper();//事件循环
    void AddEvent(LPFUNC fun,int delay,int repeat);//添加一个事件
   
private:
        /*事件结构体*/
    struct EventNode{
        LPFUNC fun;//事件函数体
        int delay;//执行延时
        int repeat;//执行次数
        int lasttime;//上一个时间
        EventNode * next,* prior;//上一级、下一级指针

    };
    EventNode *head;
    EventNode *tail;
};

(更多…)

Android 4.0 Socket调试工具制作过程及源码发布

星期一, 四月 15th, 2013 1,272 views

首先是还是界面设计

分别是IP输入、Port输入、连接按钮、接受信息文本框、输入框、发送按钮。
界面设计好之后,为对应控件添加相应功能。
(更多…)

Android 主线程、子线程间的通信问题

星期日, 四月 14th, 2013 928 views

在Android中,子线程是不可以操作UI界面的,必须在主线程中操作,同时在主线程中也不能使用网络通信,必须在子线程中使用(4.0版本后的新特性)。所以Android中关于线程间的通信便显得相当重要。

这里需要使用Looper和Handler,利用Message进行基于消息队列的线程通信,简单介绍一下几个对象

Looper:管理当前线程的消息队列。
Handler: 向目标线程发送消息Handler.sendMessage(Message msg),处理消息队列中的消息Handler.handleMessage(Message msg);
Message:线程之间传递信息的载体,包含了对消息的描述和任意的数据对象。
(更多…)

Android Socket TCP客户端简单实例

星期三, 四月 10th, 2013 1,566 views

声明:本篇代码仅可用于android 4.0以下版本,4.0以后的版本中网络连接的代码不可在主线程运行。解决方法见后续几篇博客。

由于Android中可以使用java.io.*包和java.net.*包,所以此Demo的逻辑代码和JAVA版本的client没有区别,主要区别还是在于UI和一些接口函数上。
我们抛开UI从最基础的说起。

①建立连接:

先来看建立连接的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends Activity{
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        SocketAddress socketAddress = new InetSocketAddress("192.168.0.1", 2001);
        Socket socket = new Socket();  
       
        try {
            socket.connect(socketAddress,5000);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }      
    }
......
       
}

(更多…)

Arduino机器人开发指南(七)电机驱动篇

星期二, 四月 2nd, 2013 472 views

之前我们研究了如何用Arduino驱动舵机,本次我们将一起探究一下如何用Arduino驱动直流电机。Arduino本事是无法对直流电机进行控制的,需要通过一块电机驱动板来控制电机的正转反转。这里我们选择的是L298驱动板,当然也有其他同类驱动板或者扩展板可供选择。如图,L298:

这块板子可以驱动两路电机,电机线已经接在板子的motora上了,motora中间的是外接电源的输出口,这里接在电池盒上。
简单介绍下黄色部分的8个引脚:

ENA 电机A模拟值输出端,用来控制电机的转速
IN1 为电机A提供电流,控制正反转
IN2 为电机A提供电流,控制正反转

ENB 电机B模拟值输出端,用来控制电机的转速
IN3 为电机B提供电流,控制正反转
IN4 为电机B提供电流,控制正反转

GND 接地
+5V 正极
(更多…)