【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
既然是linux编程,那么自然少不了网络编程。在linux平台上面,有很多的网络编程库可以选择,大的有boost、qt,小的有libevent,总觉得用的不是很顺手。其实在linux上面,还有一个国人写的网络库muduo,是比较小巧的,使用上面也很方便,大家可以多多使用。本身它是面向linux服务器多线程编程的,用它来写一个类ros的通信框架,再合适不过了。
本次实验用的是一个同学改写的类muduo,正版的muduo代码地址,大家可以参考这个链接。原版的muduo相对干净一点,基本上mkdir build && cd build && cmake .. && make就可以了。此外,正版本muduo所有的可执行文件都安装在build的bin目录下。
https://github.com/chenshuo/muduo/tree/master
1、下载代码
代码可以直接从github上面下载。
https://github.com/shenmingik/muduo
2、解压代码
解压的话就比较容易了,直接输入unzip muduo-main.zip即可。
3、开始编译
解压的目录下面有一个build目录,里面的文件全部删除。cd到build目录里面,直接输入cmake ..即可。
4、编译过程中的两个问题
cmake生成makefile之后,就可以开始编译了。编译过程中有两个问题,一个是提示我们找不到string定义,还有一个提示我们找不到snprintf的定义。解决方法也不复杂,首先需要Thread.hpp里面添加一个#include <string>的声明。另外snprintf的问题,则在Thread.cpp当中添加一个#include <pthread.h>的声明,这样就没什么问题了。
至此,如果一切正常,就可以在lib目录下看到生成的动态库libmymuduo.so了。
5、准备编译example中的测试文件
example里面有一个testserver.cc文件,可以用来测试和编译,
#include <TcpServer.hpp>
#include <string>
#include <functional>
using namespace std;
using namespace placeholders;
class EchoServer
{
public:
EchoServer(EventLoop *loop, InetAddress &addr, string name)
: server_(loop, addr, name), loop_(loop)
{
//注册回调函数
server_.set_connection_callback(bind(&EchoServer::on_connection, this, _1));
server_.set_message_callback(bind(&EchoServer::on_message, this, _1, _2, _3));
//设置线程数量
server_.set_thread_num(3);
}
void start()
{
server_.start();
}
private:
//连接建立或者断开的回调
void on_connection(const TcpConnectionPtr &conn)
{
if (conn->connected())
{
LOG_INFO("conn up: %s", conn->get_peeraddr().get_ip_port().c_str());
}
else
{
LOG_INFO("conn down: %s", conn->get_peeraddr().get_ip_port().c_str());
}
}
//可读事件回调
void on_message(const TcpConnectionPtr &conn, Buffer *buffer, TimeStamp time)
{
string msg = buffer->retrieve_all_asString();
conn->send(msg);
conn->shutdown();
}
private:
EventLoop *loop_;
TcpServer server_;
};
int main()
{
EventLoop loop;
InetAddress addr(8000);
EchoServer server(&loop, addr, "echo 01");
server.start();
loop.loop(); //启动main loop的底层poller
return 0;
}
输入g++ testserver.cc -I../include -g -o testserver ../lib/libmymuduo.so之后,提示我们头文件不对,这个时候把头文件当中的mymuduo/删去就可以编译通过了。
6、执行tesetserver程序
编译没有问题之后,就可以开始执行了。首先需要把so文件从lib目录拷贝过来,接着就是./testserver开始执行,这个时候提示我们找不到动态库文件,其实配置一下LD_LIBRARY_PATH就可以了。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD
执行后的打印应该是这样的,
feixiaoxing@raspberrypi:~/Desktop/mudoo/muduo-main/MyMuduo/example $ ./testserver
[INFO]2024-04-21 13:18:35 : func = update_channel fd = 4 events = 3 index = -1
[INFO]2024-04-21 13:18:35 : func = update_channel fd = 7 events = 3 index = -1
[INFO]2024-04-21 13:18:35 : EventLoop 0x7f8a17e5d0 start looping
[INFO]2024-04-21 13:18:35 : func = update_channel fd = 9 events = 3 index = -1
[INFO]2024-04-21 13:18:35 : EventLoop 0x7f8996e5d0 start looping
[INFO]2024-04-21 13:18:35 : func = update_channel fd = 11 events = 3 index = -1
[INFO]2024-04-21 13:18:35 : EventLoop 0x7f8915e5d0 start looping
[INFO]2024-04-21 13:18:35 : func = update_channel fd = 5 events = 3 index = -1
[INFO]2024-04-21 13:18:35 : EventLoop 0x7fcaf25c10 start looping