昨天在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.
恭喜你拨号成功!