67 lines
1.6 KiB
C++
67 lines
1.6 KiB
C++
#include "Socket/IOCP.hpp"
|
|
#include "Utils/ThreadPool.hpp"
|
|
|
|
#include "precomp.hpp"
|
|
|
|
namespace Chattr {
|
|
|
|
IOCP::IOCP() {
|
|
|
|
}
|
|
|
|
IOCP::~IOCP() {
|
|
destruct();
|
|
}
|
|
|
|
void IOCP::destruct() {
|
|
#ifdef __linux__
|
|
close(epollfd_);
|
|
#endif
|
|
}
|
|
|
|
void IOCP::registerSocket(Chattr::IOCPPASSINDATA* data) {
|
|
#ifdef _WIN32
|
|
HANDLE returnData = ::CreateIoCompletionPort((HANDLE)data->socket->sock, completionPort_, data->socket->sock, 0);
|
|
if (returnData == 0)
|
|
completionPort_ = returnData;
|
|
#elif __linux__
|
|
int flags = ::fcntl(data->socket->sock, F_GETFL);
|
|
flags |= O_NONBLOCK;
|
|
fcntl(data->socket->sock, F_SETFL, flags);
|
|
|
|
struct epoll_event ev;
|
|
ev.events = EPOLLIN | EPOLLONESHOT;
|
|
ev.data.ptr = data;
|
|
int rc = epoll_ctl(epollfd_, EPOLL_CTL_ADD, data->socket->sock, &ev);
|
|
if (rc < 0)
|
|
log::critical("epoll_ctl()");
|
|
#endif
|
|
}
|
|
|
|
int IOCP::recv(Chattr::IOCPPASSINDATA* data, int bufferCount) {
|
|
data->event = IOCPEVENT::READ;
|
|
#ifdef _WIN32
|
|
DWORD recvbytes = 0, flags = 0;
|
|
return ::WSARecv(data->socket->sock, &data->wsabuf, bufferCount, &recvbytes, &flags, &data->overlapped, NULL);
|
|
#elif __linux__
|
|
struct epoll_event ev;
|
|
ev.events = EPOLLIN | EPOLLONESHOT;
|
|
ev.data.ptr = data;
|
|
return ::epoll_ctl(epollfd_, EPOLL_CTL_MOD, data->socket->sock, &ev);
|
|
#endif
|
|
}
|
|
|
|
int IOCP::send(Chattr::IOCPPASSINDATA* data, int bufferCount, int __flags) {
|
|
data->event = IOCPEVENT::WRITE;
|
|
#ifdef _WIN32
|
|
DWORD sendbytes = 0;
|
|
return ::WSASend(data->socket->sock, &data->wsabuf, bufferCount, &sendbytes, __flags, &data->overlapped, NULL);
|
|
#elif __linux__
|
|
struct epoll_event ev;
|
|
ev.events = EPOLLOUT | EPOLLONESHOT;
|
|
ev.data.ptr = data;
|
|
return ::epoll_ctl(epollfd_, EPOLL_CTL_MOD, data->socket->sock, &ev);
|
|
#endif
|
|
}
|
|
|
|
} |