iocp 완성

This commit is contained in:
2025-05-02 12:05:57 +09:00
parent 14c325c428
commit 40d522e755
6 changed files with 24 additions and 18 deletions

View File

@@ -4,7 +4,8 @@ namespace Chattr {
class ServerManager { class ServerManager {
public: public:
void init();
void
}; };
} }

View File

@@ -14,7 +14,7 @@
#include "precomp.hpp" #include "precomp.hpp"
void _TCPRecvClient(Chattr::ThreadPool* threadPool, Chattr::IOCPPASSINDATA* data); void _IOCPClient(Chattr::ThreadPool* threadPool, Chattr::IOCPPASSINDATA* data);
void _TCPSendClient(Chattr::ThreadPool* threadPool, Chattr::TCPSocket sock, std::queue<Chattr::ResponsePacket> packets); void _TCPSendClient(Chattr::ThreadPool* threadPool, Chattr::TCPSocket sock, std::queue<Chattr::ResponsePacket> packets);
int main() { int main() {
@@ -22,13 +22,15 @@ int main() {
Chattr::log::setDefaultLogger(config.logLevel, config.logFileName, config.logfileSize, config.logfileCount); Chattr::log::setDefaultLogger(config.logLevel, config.logFileName, config.logfileSize, config.logfileCount);
Chattr::ThreadPool threadPool(0); Chattr::ThreadPool threadPool(0);
Chattr::IOCP iocp; Chattr::IOCP iocp;
iocp.init(&threadPool, _TCPRecvClient); iocp.init(&threadPool, _IOCPClient);
// struct Chattr::WSAManager wsaManager; // struct Chattr::WSAManager wsaManager;
Chattr::TCPSocket sock; Chattr::TCPSocket sock;
struct Chattr::Address serveraddr; struct Chattr::Address serveraddr;
Chattr::TCPSocket clientSock; Chattr::TCPSocket clientSock;
struct Chattr::Address clientAddr; struct Chattr::Address clientAddr;
bool enable = true;
sock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, (const char*)&enable, sizeof(enable));
if (config.ipVersion == 4) { if (config.ipVersion == 4) {
sock.init(AF_INET); sock.init(AF_INET);
serveraddr.set(AF_INET, INADDR_ANY, config.listenPort); serveraddr.set(AF_INET, INADDR_ANY, config.listenPort);
@@ -54,6 +56,8 @@ int main() {
while (true) { while (true) {
spdlog::info("Waiting for connection..."); spdlog::info("Waiting for connection...");
sock.accept(clientSock, clientAddr); sock.accept(clientSock, clientAddr);
bool enable = true;
clientSock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, (const char *)&enable, sizeof(enable));
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
ZeroMemory(&ptr->overlapped, sizeof(OVERLAPPED)); ZeroMemory(&ptr->overlapped, sizeof(OVERLAPPED));
ptr->socket = std::move(clientSock); ptr->socket = std::move(clientSock);
@@ -67,13 +71,7 @@ int main() {
} }
} }
void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { void _IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) {
#ifdef _WIN32
DWORD tid = GetCurrentThreadId();
#elif __linux__
pthread_t tid = pthread_self();
#endif
spdlog::info("entered recvfunc on TID: {}", tid);
Chattr::Packet pack; Chattr::Packet pack;
int packetSize = 1500; int packetSize = 1500;
int totalRedSize = 0; int totalRedSize = 0;
@@ -113,7 +111,7 @@ void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) {
dataPostPacket.convToH(); dataPostPacket.convToH();
dataPostPacket.__data.packetLength = (dataPostPacket.__data.packetLength > 1487) ? 1487 : dataPostPacket.__data.packetLength; dataPostPacket.__data.packetLength = (dataPostPacket.__data.packetLength > 1487) ? 1487 : dataPostPacket.__data.packetLength;
recvString = std::string((char *)dataPostPacket.__data.data, dataPostPacket.__data.packetLength - (sizeof(std::uint16_t)*4)); recvString = std::string((char *)dataPostPacket.__data.data, dataPostPacket.__data.packetLength - (sizeof(std::uint16_t)*4));
spdlog::info("Red size : {}, {} from : [{}]", totalRedSize, recvString, (std::string)data->socket.remoteAddr); spdlog::info("Red size : {}, {} from : [{}]", data->wsabuf.len, recvString, (std::string)data->socket.remoteAddr);
break; break;
case Chattr::DataType::BINARY: case Chattr::DataType::BINARY:
break; break;
@@ -168,14 +166,9 @@ void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) {
packetError = true; packetError = true;
break; break;
} }
DWORD recvbytes = 0, flags = 0;
Sleep(10000); int returnData = WSARecv(data->socket.sock, &data->wsabuf, 1, &recvbytes, &flags, &data->overlapped, NULL);
/*if (packetError) {
thread->enqueueJob(_TCPRecvClient, data);;
}
else
thread->enqueueJob(_TCPRecvClient, data);*/
} }
void _TCPSendClient(Chattr::ThreadPool* thread, Chattr::TCPSocket sock, std::queue<Chattr::ResponsePacket> packets) { void _TCPSendClient(Chattr::ThreadPool* thread, Chattr::TCPSocket sock, std::queue<Chattr::ResponsePacket> packets) {

View File

@@ -15,4 +15,10 @@ void IOCP::registerSocket(SOCKET sock) {
#endif #endif
} }
int IOCP::recv(void* __restrict __buf, size_t __n, int __flags) {
}
int IOCP::send(const void* __buf, size_t __n, int __flags) {
}
} }

View File

@@ -54,6 +54,10 @@ void Socket::set(const SOCKET __sock, int __domain) {
valid_ = true; valid_ = true;
}; };
int Chattr::Socket::setsockopt(int level, int optname, const char FAR* optval, int optlen) {
return ::setsockopt(sock, level, optname, optval, optlen);
}
int Socket::bind(Address __addr) { int Socket::bind(Address __addr) {
bindAddr = __addr; bindAddr = __addr;
int retVal = ::bind(sock, &__addr.addr, __addr.length); int retVal = ::bind(sock, &__addr.addr, __addr.length);

View File

@@ -27,6 +27,7 @@ public:
int retVal = GetQueuedCompletionStatus(completionPort_, &cbTransfrred, (PULONG_PTR)&sock, (LPOVERLAPPED*)&data, INFINITE); int retVal = GetQueuedCompletionStatus(completionPort_, &cbTransfrred, (PULONG_PTR)&sock, (LPOVERLAPPED*)&data, INFINITE);
if (retVal == 0 || cbTransfrred == 0) { if (retVal == 0 || cbTransfrred == 0) {
spdlog::info("Client disconnected. [{}]", (std::string)(data->socket.remoteAddr)); spdlog::info("Client disconnected. [{}]", (std::string)(data->socket.remoteAddr));
delete data;
threadPool->enqueueJob(iocpWather, completionPort_, callback); threadPool->enqueueJob(iocpWather, completionPort_, callback);
return; return;
} }

View File

@@ -16,6 +16,7 @@ public:
operator SOCKET(); operator SOCKET();
void set(const SOCKET __sock, int __domain); void set(const SOCKET __sock, int __domain);
int setsockopt(int level, int optname, const char FAR* optval, int optlen);
int bind(Address __addr); int bind(Address __addr);