天天看点

华为H3C拨号软件编译过程

昨天在ubuntu9。04上装里linux1x的拨号端,可连上之后老是断网,今天把这问题给解决了。

以前用的拨号客户端都是别人编译好的,自己直接拿过来用 就行了,这次想自己编译一个。首先下来源文件下载地址 http://sourceforge.net/projects/h3cclient  源文件是用C++写的,还需要编译器g++和一个库文件libpcap-dev 如果你可以先用其他办法连上网络的话(比如和同学共享网络或者使用路由器)执行一下命令安装

sudo apt-get install g++

sudo apt-get install libpcap-dev

如果你没法上网的话,可以去下载来这两个文件来安装。

以下是在我个人机子上的编译过程,环境:ubuntu9.04 i386架构

1进入文件夹进行编译

[email protected]:~$ cd test2

[email protected]:~/test2$ ls

dot1x.cpp  global.h  Makefile  md5.h   README

dot1x.h    main.cpp  md5.cpp   pcap.h

[email protected]:~/test2$ sudo make

g++    -c -o main.o main.cpp

In file included from dot1x.h:5,

                 from main.cpp:2:

pcap.h:269: 错误: C 函数‘u_int bpf_filter(bpf_insn*, __u_char*, u_int, u_int)’的声明

/usr/include/pcap/bpf.h:919: 错误: 与此处早先的声明‘u_int bpf_filter(const bpf_insn*, const __u_char*, u_int, u_int)’冲突

pcap.h:270: 错误: C 函数‘int bpf_validate(bpf_insn*, int)’的声明

/usr/include/pcap/bpf.h:918: 错误: 与此处早先的声明‘int bpf_validate(const bpf_insn*, int)’冲突

main.cpp: In function ‘int main(int, char**)’:

main.cpp:52: 错误: ‘strcmp’在此作用域中尚未声明

main.cpp:72: 错误: ‘strlen’在此作用域中尚未声明

main.cpp:73: 错误: ‘strcpy’在此作用域中尚未声明

main.cpp:127: 错误: ‘strtok’在此作用域中尚未声明

main.cpp:156: 错误: ‘strcpy’在此作用域中尚未声明

main.cpp:158: 错误: ‘strtok’在此作用域中尚未声明

make: *** [main.o] 错误 1

2.这里会出现几个错误,可能是库文件不同还是作者小小的失误,很简单打开源文件main.cpp把其中的声明#include <string>改成#include <string.h>再编译

[email protected]:~/test2$ sudo make

g++    -c -o main.o main.cpp

In file included from dot1x.h:5,

                 from main.cpp:2:

pcap.h:269: 错误: C 函数‘u_int bpf_filter(bpf_insn*, __u_char*, u_int, u_int)’的声明

/usr/include/pcap/bpf.h:919: 错误: 与此处早先的声明‘u_int bpf_filter(const bpf_insn*, const __u_char*, u_int, u_int)’冲突

pcap.h:270: 错误: C 函数‘int bpf_validate(bpf_insn*, int)’的声明

/usr/include/pcap/bpf.h:918: 错误: 与此处早先的声明‘int bpf_validate(const bpf_insn*, int)’冲突

make: *** [main.o] 错误 1

[email protected]:~/test2$

3.少了几个错误,但是还是通不过编译,这可能是由于库函数声明有冲突,版本不同引起的,再改,打开源文件pcap.h找到这个位置注释掉,继续编译

4.又出现了错误

[email protected]:~/test2$ make

g++    -c -o main.o main.cpp

g++    -c -o dot1x.o dot1x.cpp

dot1x.cpp: In constructor ‘NetworkOperation::HuaweiNetwork::HuaweiNetwork(const std::string&, const std::string&, const std::string&, int*, int*, int)’:

dot1x.cpp:92: 错误: ‘strcpy’在此作用域中尚未声明

dot1x.cpp:117: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp:121: 错误: ‘srand’在此作用域中尚未声明

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::run()’:

dot1x.cpp:150: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::SetMd5Buf(PasswordFrm*, __u_char, const __u_char*)’:

dot1x.cpp:302: 错误: ‘strlen’在此作用域中尚未声明

dot1x.cpp:304: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::InitBuf(__u_char*)’:

dot1x.cpp:315: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp:316: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘bool NetworkOperation::HuaweiNetwork::SendLogin()’:

dot1x.cpp:326: 错误: ‘memset’在此作用域中尚未声明

dot1x.cpp: In member function ‘bool NetworkOperation::HuaweiNetwork::SendUsername(__u_char)’:

dot1x.cpp:405: 错误: ‘strlen’在此作用域中尚未声明

dot1x.cpp:413: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp:414: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘bool NetworkOperation::HuaweiNetwork::SendPassword(__u_char, const __u_char*)’:

dot1x.cpp:429: 错误: ‘strlen’在此作用域中尚未声明

dot1x.cpp:436: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::GenerateVersion(__u_char*)’:

dot1x.cpp:450: 错误: ‘rand’在此作用域中尚未声明

dot1x.cpp:454: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp:460: 错误: ‘memset’在此作用域中尚未声明

dot1x.cpp:461: 错误: ‘strlen’在此作用域中尚未声明

dot1x.cpp:466: 警告: 不建议使用从字符串常量到‘char*’的转换

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::EncodeVersion(char*, unsigned char*, int)’:

dot1x.cpp:493: 错误: ‘strlen’在此作用域中尚未声明

dot1x.cpp:497: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp:500: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::Connected()’:

dot1x.cpp:512: 错误: ‘system’在此作用域中尚未声明

dot1x.cpp: In member function ‘bool NetworkOperation::HuaweiNetwork::SendKeeponline(__u_char)’:

dot1x.cpp:526: 错误: ‘strlen’在此作用域中尚未声明

dot1x.cpp:534: 错误: ‘memcpy’在此作用域中尚未声明

dot1x.cpp: In member function ‘bool NetworkOperation::HuaweiNetwork::GetToken(TokenFrm*)’:

dot1x.cpp:553: 错误: ‘memcpy’在此作用域中尚未声明

make: *** [dot1x.o] 错误 1

[email protected]:~/test2$

5.这次和第一次的错误相同,打开dot1x.cpp改一下函数声明#include <string>为#include <string.h>继续编译

[email protected]:~/test2$ make

g++    -c -o dot1x.o dot1x.cpp

dot1x.cpp: In constructor ‘NetworkOperation::HuaweiNetwork::HuaweiNetwork(const std::string&, const std::string&, const std::string&, int*, int*, int)’:

dot1x.cpp:121: 错误: ‘srand’在此作用域中尚未声明

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::GenerateVersion(__u_char*)’:

dot1x.cpp:450: 错误: ‘rand’在此作用域中尚未声明

dot1x.cpp:466: 警告: 不建议使用从字符串常量到‘char*’的转换

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::Connected()’:

dot1x.cpp:512: 错误: ‘system’在此作用域中尚未声明

make: *** [dot1x.o] 错误 1

6.这次错误可能又是函数声明的问题,google了一下,打开dot1x.cpp在函数声明中加入 

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

7.继续编译

[email protected]:~/test2$ make

g++    -c -o dot1x.o dot1x.cpp

dot1x.cpp: In member function ‘void NetworkOperation::HuaweiNetwork::GenerateVersion(__u_char*)’:

dot1x.cpp:470: 警告: 不建议使用从字符串常量到‘char*’的转换

g++    -c -o md5.o md5.cpp

g++ -o h3cclient main.o dot1x.o md5.o  -lpcap

[email protected]:~/test2$

8.编译成功,现在看看文件家里是不多了几个文件

[email protected]:~/test2$ ls

dot1x.cpp   dot1x.h  global.h   main.cpp   main.o    md5.cpp  md5.o   pcap.h~

dot1x.cpp~  dot1x.o  h3cclient  main.cpp~  Makefile  md5.h    pcap.h  README

[email protected]:~/test2$

9.如果有一个可执行文件h3cclient 就编译成功了,现在就可以用你自己编译的拨号短拨号了

[email protected]:~/test2$ sudo ./h3cclient

You must specify a interface, e.g. eth0.

[email protected]:~/test2$

[email protected]:~/test2$ sudo ./h3cclient -u 000000/12345 eth0 

Initializing Network Adapter...

Login sent

EAP_IDENTIFY received.

Verifying User Name ...

EAP_MD5 received.

Verifying Password ...

Successfully Login.

恭喜你拨号成功!