iocp 완성
This commit is contained in:
@@ -4,7 +4,8 @@ namespace Chattr {
|
|||||||
|
|
||||||
class ServerManager {
|
class ServerManager {
|
||||||
public:
|
public:
|
||||||
|
void init();
|
||||||
|
void
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user