最近学习服务器开发,libevent是一个轻量级的高性能I/O框架库,通过使用、分析libevent可以很好的学习网络编程,同时在阅读libevent源码的过程中可以提高自己的编程技巧和代码架构能力。当然了,首先要做的工作就是安装libevent,我从官网下载了libevent-2.0.21和libevent-1.4.15两个版本,对于使用来说还是新版的比较好,但新版的结构比较庞杂,代码量比较大,对于阅读源码来说还是前期版本比较合适,功能齐全而且体量小。
由于我是在Windows系统下用虚拟机安装Ubuntu系统,下载的libevent在Windows系统,所以需要将其移动到虚拟机中,虽然更新过VMware tools,但是直接拖文件的操作仍然会出现文件夹中文件丢失的问题,刚好之前用过SSH,就选择SSH登陆Ubuntu,因为好久没用,而且Ubuntu是新安装的,出现了很多问题,在此记录。
下文中二级标题使用蓝色字体显示,终端命令均通过加黑显示,命令执行或者各项步骤中出错均使用红色字体显示,便于强调,方便大家识别。
主机通过SSH登陆局域网其他主机(此处使用为Windows主机SSH登陆虚拟机内Ubuntu系统):
安装openssh
sudo apt-get install openssh-server
安装过程中会有一次询问,输入“yes”
修改root密码(root用户默认不存在,首次使用需要设置密码)
sudo passwd root
首先输入当前用户密码,然后输入两次你要设置的root密码
编辑配置文件,允许root用户使用SSH服务
sudo vim /etc/ssh/sshd_config
如果没有安装vim,将vim改为vi,vim或者vi的操作自行学习
找到:PermitRootLogin prohibit-password(禁用的意思) 用#注释掉
添加:PermitRootLogin yes
sudo service ssh restart
学习自:解决Ubuntu 16.04 SSH 无法远程登录问题
严格按照以上步骤基本可以成功使用SSH,但还有可能遇到另一个问题:报“algorithm negotiation failed”错误,这个错误是由于服务器端更新过SSH,但客户端的版本比较低,新版本为了安全默认取消了原来的一些加密算法,我们手动添加进去就好:
更改文件权限
chmod 777 /etc/ssh/sshd_config
编辑配置文件,添加被取消的加密算法
sudo vim /etc/ssh/sshd_config
重启sshd服务
sudo service sshd restart
步骤2中需要添加的部分:
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc
MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
学习自:SSH Secure Shell登录报错: Ubuntu SSH Algorithm negotiation failed
安装libevent
至此,libevent就成功的安装进你的系统里啦,你可以在/usr/local/lib文件夹中找到它(们)了,接下来,就可以直接在你的程序中通过头文件的形式包含libevent库了。
测试libevent
可以直接到/usr/local/lib文件夹查看libevent,也可以通过命令直接显示:
ls -al /usr/local/lib | grep libevent
这里给出一个简单的测试用例test.cpp,代码如下:
#include
#include
struct event ev;
struct timeval tv;
using namespace std;
void time_cb(int fd, short event, void *argc)
{
cout << "timer wakeup" << endl;
event_add(&ev, &tv);
}
int main()
{
struct event_base *base = event_init();
tv.tv_sec = 10;
tv.tv_usec = 0;
evtimer_set(&ev, time_cb, NULL);
event_add(&ev, &tv);
event_base_dispatch(base);
return 0;
}
然后进行编译执行,首先进入代码文件所在文件夹,编译:
g++ test.cpp -o test -levent
执行:
./test
执行结果如下则运行成功。