#include "Socket/IOCP.hpp" #include "Utils/ThreadPool.hpp" #include "precomp.hpp" namespace Chattr { 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) { #ifdef _WIN32 DWORD recvbytes = 0, flags = 0; return ::WSARecv(data->socket.sock, &data->wsabuf, 1, &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 __flags) { #ifdef _WIN32 DWORD sendbytes = 0; return ::WSASend(data->socket.sock, &data->wsabuf, 1, &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 } }