ntop自动退出

OS: RHEL6.0  x64

ntop: 4.1.0 (64 bit)

通过下载官方ntop源代码方式安装。

启动正常,显示页面也正常,但ntop运行时间不定就自己自动退出了。

查看系统日志,发现有一句:

ntop[17959]: segfault at fffffff7 ip 0000003a3ba7a76c sp 00007f58e13a4b58 error 4 in libc-2.12.so[3a3ba00000+175000]

搜索了一下也未果,不过看到这里 http://www.linuxsir.org/bbs/showthread.php?t=76339  有说

机器配置是双P4 XEON 2.4 2G内存,仍然会很快死掉
后来我仔细查找了原因,是因为NTOP占用了太多的内存,NTOP的机制是每记录一个IP,就会给它分配一部分内存,所以如果你的网段内机器多,或者是有中病毒后狂乱发包的机器,那结果......

所以强烈建议你启动NTOP的时候加上特定地址段的参数(看说明,很简单的)....


再看ntop启动参数 ntop -h ,其中有两个参数

[-x <max num hash entries> ]                          Max num. hash entries ntop can handle (default 8192)

[--disable-stopcap]                                   Capture packets even if there's no memory left

-x 参数应该是最大处理条目数,默认为8192条

--disable-stopcap  即使内存不足,也继续捕捉数据包


既然ntop有 --disable-stopcap 参数,或许ntop为了保证系统正常运行,就强行自动退出以保证系统稳定运行,而不是继续去抓包。而一般公司里使用ntop,无非就是看看排名靠前的一些流量。所以我们可以把启动方式更改只列出50个数据列表:

ntop -i eth0,eth1 -u ntop  -x 50
如果还要更进一步抓取指定网段10.10.30.0/24,可以:
ntop -i eth0,eth1 -u ntop -m 10.10.30.0/24 -x 50

目前ntop运行正常,暂时没有异常退出。

头文件TCP.h#pragma once #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") class server { private: fd_set readfds; // 设置一个主集合,存储所有要监听的套接字 bool serverRun; SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); private: void serverStart(); friend void start(server &obj); void clientListen(); public: server(); }; class callback { }; TCP.cpp #include "TCP.h" #include <map> #include <thread> #include <mutex> // 设置一个map容器存储所有的客户端 std::map<int, SOCKET> clients; // 初始化客户端的数量为0 int clientNum = 0; std::mutex mux; // 构造函数定义,用于初始化Winsock server::server() { // 初始化Winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "WSAStartup failed." << std::endl; return; } // 初始化主集合 FD_ZERO(&readfds); // FD_SET(serverSocket, &readfds); } void start(server &obj) { fd_set readfds; server s; s.serverRun = true; // client c; // c.clientRun = true; std::thread t1(&server::serverStart, &s); std::thread t2(&server::clientListen, &s); t1.join(); t2.join(); } void server::clientListen() { fd_set readfds1; // 监听是否有新的客户端与服务端相连 while (serverRun) { FD_ZERO(&readfds1); FD_SET(serverSocket, &readfds1); select(0, &readfds1, NULL, NULL, NULL); if (FD_ISSET(serverSocket, &readfds1)) { std::cout << "server" << std::endl; std::unique_lock<std::mutex> lock(mux);// 加锁防止与检测客户端状态冲突 sockaddr_in clientAddr; int clientaddrSize = sizeof(clientAddr); // 与客户端连接 SOCKET newSocket = accept(serverSocket, (sockaddr *)&clientAddr, &clientaddrSize); if (newSocket == INVALID_SOCKET) { std::cerr << "accept failed: " << WSAGetLastError() << std::endl; return; } else { // 客户端数量加1 clientNum++; // 向map容器添加新客户端 clients.insert(std::make_pair(clientNum, newSocket)); // 将新连接的客户端加入到bit map中监视 FD_SET(clients[clientNum], &readfds); // 向主集合中添加套接字 char clientIP[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, INET_ADDRSTRLEN); std::cout << "新客户端" << clientNum << "连接: " << clientIP << ":" << htons(clientAddr.sin_port) << std::endl; } } } } void server::serverStart() { std::cout << "服务器已启动" << std::endl; // 创建套接字 if (serverSocket == INVALID_SOCKET) { std::cerr << "fail to creat serverSocket:" << WSAGetLastError() << std::endl; WSACleanup(); return; } // 绑定套接字 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(9090); serverAddr.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(serverSocket, (sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { std::cerr << "fail to bind socket" << std::endl; return; } // 监听 if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { std::cerr << "fail to listen socket" << std::endl; } std::cout << "端口号为:" << htons(serverAddr.sin_port) << std::endl; std::cout << "等待客户端连接中......" << std::endl; while (serverRun) { fd_set readfds2 = readfds; // 等待客户端操作(连接,关闭,输入信息) select(0, &readfds2, NULL, NULL, NULL); // 遍历容器 for (const auto &pair : clients) { // 检测客户端状态 if (FD_ISSET(pair.second, &readfds2)) { std::unique_lock<std::mutex> lock(mux); // 加锁防止与添加新客户端冲突 // 接收客户端消息 char recvBuf[100]; int bytesReceived = recv(pair.second, recvBuf, sizeof(recvBuf), 0); if (bytesReceived > 0) { recvBuf[bytesReceived] = '\0'; std::cout << "收到客户端" << pair.first << "的消息:" << recvBuf << std::endl; // 向客户端发送消息 const char *sendBuf = "消息已发出"; if (send(pair.second, sendBuf, (int)strlen(sendBuf), 0) < 0) { std::cerr << "发送失败" << std::endl; } break; } else { // 客户端退出或其他状态 std::cout << "客户端" << pair.first << "已退出" << std::endl; closesocket(pair.second); clients.erase(pair.first); break; } } } } main.cpp #include <TCP.h> int main() { server obj; start(obj); return 0; }为什么我与客户端相连时总是不稳定,有时候输入了没有动静,有时候接收不到客户端的消息 以下为一次结果: 服务器已启动 端口号为:9090 等待客户端连接中...... server 新客户端1连接: 127.0.0.1:60314 server 新客户端2连接: 127.0.0.1:60315 server 新客户端3连接: 127.0.0.1:60316 server 新客户端4连接: 127.0.0.1:60317 server 新客户端5连接: 127.0.0.1:60318 server 新客户端6连接: 127.0.0.1:60319 server 新客户端7连接: 127.0.0.1:60320 客户端1已退出 客户端2已退出 客户端3已退出 客户端4已退出 客户端5已退出 客户端6已退出 客户端7已退出 server 新客户端8连接: 127.0.0.1:60398 server 客户端8已退出 新客户端9连接: 127.0.0.1:60414 客户端9已退出 server 新客户端10连接: 127.0.0.1:60439 server 客户端10已退出 新客户端11连接: 127.0.0.1:60442 server 客户端11已退出 新客户端12连接: 127.0.0.1:60443 客户端12已退出
最新发布
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值