有一个客户端(192.168.31.26)没有触发epoll事件,所以没有打印出来。
#include <iostream>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <string.h>
#include <unistd.h>
#include <thread>
#include <fcntl.h>
#include "sock.h"
#include "constant.h"
#include "util.h"
#include "ring_buffer.h"
using namespace std;
class Acq103{
int epoll_fd;
Sock sock;
RingBuffer recv_ring_buffer;
char recv_string[Constant::STRING_BUFFER_SIZE];
thread main_thread;
void setNonBlocking(int _client_socket_fd){
int flags = fcntl(_client_socket_fd, F_GETFL, 0);
fcntl(_client_socket_fd, F_SETFL, flags | O_NONBLOCK);
}
void addEvent(int _client_socket_fd){
epoll_event event;
event.data.fd = _client_socket_fd;
event.events = EPOLLIN | EPOLLOUT | EPOLLET;
epoll_ctl(this->epoll_fd, EPOLL_CTL_ADD, _client_socket_fd, &event);
}
void handleNewConnection(){
int client_socket_fd = sock.accept();
if (client_socket_fd < 0){
cout << "Accept error" << endl;
return;
}
cout << Util::get_ip_from_sock(client_socket_fd) << " is connected to the server at "<< Util::get_current_time() <<"." << endl;
setNonBlocking(client_socket_fd);
addEvent(client_socket_fd);
}
void handleSend(int _client_socket_fd){
}
void handleReceive(int _client_socket_fd){
Sock client_socket;
client_socket.set_handle(_client_socket_fd);
recv_ring_buffer.read_from_socket(client_socket, Constant::MAX_LENGTH);
int m = recv_ring_buffer.read(recv_string, Constant::STRING_BUFFER_SIZE);
recv_ring_buffer.clear();
}
public:
Acq103(int _port){
sock.open(AF_INET, SOCK_STREAM, 0);
sock.set_reuse_addr();
sock.set_non_blocking();
sock.bind(Addr(INADDR_ANY, _port));
sock.listen();
cout << "Server is listening on port " << _port << endl;
epoll_fd = epoll_create1(0);
addEvent(sock.get_handle());
}
void run(){
epoll_event events[Constant::MAX_EVENTS];
while(true){
int nfds = epoll_wait(epoll_fd, events, Constant::MAX_EVENTS, 200);
for (int n = 0; n < nfds; n++) {
cout << "Event: " << events[n].data.fd << " " << events[n].events << endl;
if (events[n].data.fd == sock.get_handle()) {
handleNewConnection();
} else if (events[n].events & EPOLLIN) {
handleReceive(events[n].data.fd);
} else if (events[n].events & EPOLLOUT) {
handleSend(events[n].data.fd);
}
}
}
}
~Acq103(){
close(epoll_fd);
}
void start(){
main_thread = thread(&Acq103::run, this);
}
void join(){
main_thread.join();
}
};
void thread_udp(void){
/*
* a thread sending UDP message to relay equipment
*/
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_fd < 0){
cout << "Create UDP Socket Error!" << endl;
return;
}
uint8_t buf[41];
buf[0]= 0xFF;
for(int i = 1; i < 41; i++)
buf[i] = 0x00;
while(true) {
const int opt = -1;
int nb = 0;
setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
nb = setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
if(nb == -1){
cout << "Set Broadcast Error!" << endl;
return;
}
sockaddr_in relayAddr;
memset(&relayAddr, 0, sizeof(relayAddr));
relayAddr.sin_family = AF_INET;
relayAddr.sin_port = htons(1032);
//relayAddr.sin_addr.s_addr = inet_addr("192.168.31.26");
inet_pton(AF_INET, "192.168.31.255", &relayAddr.sin_addr);
int len = sizeof(relayAddr);
///send message to relay equipment
int send_num = sendto(socket_fd, buf, 41, 0, (sockaddr *)&relayAddr, len);
if(send_num < 0){
cerr << "Send to equipment error" << endl;
close(socket_fd);
return;
}
sleep(5);
}
}
int main(){
thread t1(thread_udp);
Acq103 acq103(1048);
acq103.start();
t1.join();
acq103.join();
delete &acq103;
return 0;
}
输出:
Event: 3 1
192.168.31.127 is connected to the server at 2026-01-09 03:17:30.
Event: 6 4
Event: 3 1
192.168.31.27 is connected to the server at 2026-01-09 03:17:30.
有一个客户端(192.168.31.26)没有触发epoll事件,所以没有打印出来。