iocp 완성
This commit is contained in:
@@ -4,7 +4,8 @@ namespace Chattr {
|
||||
|
||||
class ServerManager {
|
||||
public:
|
||||
|
||||
void init();
|
||||
void
|
||||
};
|
||||
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#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);
|
||||
|
||||
int main() {
|
||||
@@ -22,13 +22,15 @@ int main() {
|
||||
Chattr::log::setDefaultLogger(config.logLevel, config.logFileName, config.logfileSize, config.logfileCount);
|
||||
Chattr::ThreadPool threadPool(0);
|
||||
Chattr::IOCP iocp;
|
||||
iocp.init(&threadPool, _TCPRecvClient);
|
||||
iocp.init(&threadPool, _IOCPClient);
|
||||
// struct Chattr::WSAManager wsaManager;
|
||||
|
||||
Chattr::TCPSocket sock;
|
||||
struct Chattr::Address serveraddr;
|
||||
Chattr::TCPSocket clientSock;
|
||||
struct Chattr::Address clientAddr;
|
||||
bool enable = true;
|
||||
sock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, (const char*)&enable, sizeof(enable));
|
||||
if (config.ipVersion == 4) {
|
||||
sock.init(AF_INET);
|
||||
serveraddr.set(AF_INET, INADDR_ANY, config.listenPort);
|
||||
@@ -54,6 +56,8 @@ int main() {
|
||||
while (true) {
|
||||
spdlog::info("Waiting for connection...");
|
||||
sock.accept(clientSock, clientAddr);
|
||||
bool enable = true;
|
||||
clientSock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, (const char *)&enable, sizeof(enable));
|
||||
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
|
||||
ZeroMemory(&ptr->overlapped, sizeof(OVERLAPPED));
|
||||
ptr->socket = std::move(clientSock);
|
||||
@@ -67,13 +71,7 @@ int main() {
|
||||
}
|
||||
}
|
||||
|
||||
void _TCPRecvClient(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);
|
||||
void _IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) {
|
||||
Chattr::Packet pack;
|
||||
int packetSize = 1500;
|
||||
int totalRedSize = 0;
|
||||
@@ -113,7 +111,7 @@ void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) {
|
||||
dataPostPacket.convToH();
|
||||
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));
|
||||
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;
|
||||
case Chattr::DataType::BINARY:
|
||||
break;
|
||||
@@ -168,14 +166,9 @@ void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) {
|
||||
packetError = true;
|
||||
break;
|
||||
}
|
||||
DWORD recvbytes = 0, flags = 0;
|
||||
|
||||
Sleep(10000);
|
||||
|
||||
/*if (packetError) {
|
||||
thread->enqueueJob(_TCPRecvClient, data);;
|
||||
}
|
||||
else
|
||||
thread->enqueueJob(_TCPRecvClient, data);*/
|
||||
int returnData = WSARecv(data->socket.sock, &data->wsabuf, 1, &recvbytes, &flags, &data->overlapped, NULL);
|
||||
}
|
||||
|
||||
void _TCPSendClient(Chattr::ThreadPool* thread, Chattr::TCPSocket sock, std::queue<Chattr::ResponsePacket> packets) {
|
||||
|
||||
@@ -15,4 +15,10 @@ void IOCP::registerSocket(SOCKET sock) {
|
||||
#endif
|
||||
}
|
||||
|
||||
int IOCP::recv(void* __restrict __buf, size_t __n, int __flags) {
|
||||
}
|
||||
|
||||
int IOCP::send(const void* __buf, size_t __n, int __flags) {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -54,6 +54,10 @@ void Socket::set(const SOCKET __sock, int __domain) {
|
||||
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) {
|
||||
bindAddr = __addr;
|
||||
int retVal = ::bind(sock, &__addr.addr, __addr.length);
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
int retVal = GetQueuedCompletionStatus(completionPort_, &cbTransfrred, (PULONG_PTR)&sock, (LPOVERLAPPED*)&data, INFINITE);
|
||||
if (retVal == 0 || cbTransfrred == 0) {
|
||||
spdlog::info("Client disconnected. [{}]", (std::string)(data->socket.remoteAddr));
|
||||
delete data;
|
||||
threadPool->enqueueJob(iocpWather, completionPort_, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ public:
|
||||
|
||||
operator SOCKET();
|
||||
void set(const SOCKET __sock, int __domain);
|
||||
int setsockopt(int level, int optname, const char FAR* optval, int optlen);
|
||||
|
||||
int bind(Address __addr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user