Loading cpp.hint 0 → 100644 +4 −0 Original line number Diff line number Diff line // Hinweisdateien unterstützen die Visual Studio-IDE beim Interpretiertieren von Visual C++-Bezeichnern, // z. B. von Namen der Funktionen und Makros. // Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=865984 #define BLOCKSIZE src/event/iocp.cpp +44 −106 Original line number Diff line number Diff line Loading @@ -60,7 +60,6 @@ namespace netplus { client(eventapi* eapi) { api = eapi; api->CreateConnetion(&CurCon); OpCode = 0; }; ~client() { Loading @@ -68,7 +67,6 @@ namespace netplus { }; std::mutex ConLock; int OpCode; //will be used by the worker thread to decide what operation to perform eventapi* api; con* CurCon; }; Loading @@ -76,13 +74,7 @@ namespace netplus { class poll { public: enum states { OP_ACCEPT = 0, OP_READ = 1, OP_WRITE = 2 }; poll(HANDLE iocp, eventapi* api, socket* ssock) { poll(HANDLE iocp,std::mutex &amtx,eventapi* api, socket* ssock) : g_amtx (amtx){ g_iocp = iocp; g_eventapi = api; g_serversocket = ssock; Loading Loading @@ -120,8 +112,8 @@ namespace netplus { } void AcceptConnection(int tid, ULONG_PTR args) { g_amtx.lock(); client* pClientContext = new client(g_eventapi); pClientContext->OpCode = OP_ACCEPT; if (g_serversocket->_Type == TCP) pClientContext->CurCon->csock = new tcp; Loading @@ -129,6 +121,8 @@ namespace netplus { try { g_serversocket->accept(pClientContext->CurCon->csock); pClientContext->CurCon->csock->setFlag(FIONBIO, 0); //Store this object AddToClientList(pClientContext); Loading @@ -136,25 +130,34 @@ namespace netplus { } catch (NetException& e) { delete pClientContext->CurCon->csock; RemoveFromClientList(pClientContext); g_amtx.unlock(); throw e; } g_eventapi->ConnectEvent(pClientContext->CurCon, tid, args); g_amtx.unlock(); std::shared_ptr<char[]> buf(new char[BLOCKSIZE], std::default_delete<char[]>()); int recv = pClientContext->CurCon->csock->recvData(buf.get(), BLOCKSIZE, 0); size_t recv = pClientContext->CurCon->csock->recvData(buf.get(), BLOCKSIZE, 0); pClientContext->CurCon->RecvData.append(buf.get(), recv); } std::cerr.write(buf.get(), recv) << std::endl; g_eventapi->RequestEvent(pClientContext->CurCon, tid, args); } private: HANDLE g_iocp; socket* g_serversocket; eventapi* g_eventapi; std::vector<client*> g_ClientContext; std::mutex g_polllock; std::mutex& g_amtx; friend class client; friend class EventWorker; }; Loading Loading @@ -197,7 +200,7 @@ namespace netplus { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); threads = 2; // sysinfo.dwNumberOfProcessors; threads = sysinfo.dwNumberOfProcessors; } event::~event() { Loading Loading @@ -240,20 +243,7 @@ namespace netplus { DWORD ret = 0; ULONG ssize = 0; auto elock = [eargs](client* eclient) { // eargs->mtx->lock(); // eclient->ConLock.lock(); // eargs->mtx->unlock(); }; auto eunlock = [eargs](client* eclient) { //eargs->mtx->lock(); //eclient->ConLock.unlock(); // eargs->mtx->unlock(); }; for (;;) { int bReturn = GetQueuedCompletionStatus( eargs->eviocp, &dwBytesTransfered, Loading @@ -261,62 +251,42 @@ namespace netplus { &pOverlapped, WSA_INFINITE); if (!eargs->mtx->try_lock()) continue; if (lpContext == 0) { eargs->mtx->unlock(); continue; } pClientContext = (client*)lpContext; elock(pClientContext); if ((bReturn == 0) && (0 == dwBytesTransfered)) { eargs->evpoll->RemoveFromClientList(pClientContext); eargs->mtx->unlock(); continue; } std::cerr << pClientContext->OpCode << std::endl; switch (pClientContext->OpCode) { case poll::OP_ACCEPT: std::cout.write(pClientContext->CurCon->RecvData.data(), pClientContext->CurCon->RecvData.size()); try { eargs->event->ConnectEvent(pClientContext->CurCon, tid, args); eargs->event->RequestEvent(pClientContext->CurCon, tid, args); if (!((con*)pClientContext->CurCon)->SendData.empty()) { pClientContext->OpCode = poll::OP_READ; dwFlags = 0; ssize = BLOCKSIZE < pClientContext->CurCon->SendData.size() ? BLOCKSIZE : (ULONG)pClientContext->CurCon->SendData.size(); std::shared_ptr<char[]> buf(new char[16384], std::default_delete<char[]>()); pClientContext->OpCode = poll::OP_WRITE; //Overlapped send try { ret = pClientContext->CurCon->csock->sendData(buf.get(), ssize, 0); } catch (NetException& e) { eargs->evpoll->RemoveFromClientList(pClientContext); throw e; } ret = pClientContext->CurCon->csock->sendData(pClientContext->CurCon->SendData.data(), ssize, 0); pClientContext->CurCon->SendData.resize(ret); try { eargs->event->ResponseEvent(pClientContext->CurCon, tid, args); } } catch (NetException& e) { std::cerr << e.what() << std::endl; } break; case poll::OP_READ: try { } else { dwFlags = 0; std::shared_ptr<char[]> buf(new char[16384], std::default_delete<char[]>()); Loading @@ -329,46 +299,14 @@ namespace netplus { ret = pClientContext->CurCon->csock->sendData(buf.get(), ssize, 0); pClientContext->OpCode = poll::OP_WRITE; } catch (NetException& e) { std::cerr << e.what() << std::endl; } break; case poll::OP_WRITE: try { if(!((con*)pClientContext->CurCon)->SendData.empty()) { dwFlags = 0; ssize = BLOCKSIZE < pClientContext->CurCon->SendData.size() ? BLOCKSIZE : (ULONG)pClientContext->CurCon->SendData.size(); std::shared_ptr<char[]> buf(new char[16384], std::default_delete<char[]>()); //Overlapped send ret = pClientContext->CurCon->csock->sendData(buf.get(), ssize, 0); pClientContext->CurCon->SendData.resize(ret); try { eargs->event->ResponseEvent(pClientContext->CurCon, tid, args); } catch (NetException& e) { std::cerr << e.what() << std::endl; } } else { pClientContext->OpCode = poll::OP_READ; } } catch (NetException& e) { std::cerr << e.what() << std::endl; eargs->evpoll->RemoveFromClientList(pClientContext); } break; default: eargs->evpoll->RemoveFromClientList(pClientContext); break; } // switch eunlock(pClientContext); eargs->mtx->unlock(); } // while } }; Loading @@ -394,10 +332,10 @@ namespace netplus { memset(&olOverlap, 0, sizeof(olOverlap)); poll evpoll(iocp, this, _ServerSocket); std::mutex pmtx; poll evpoll(iocp,pmtx, this, _ServerSocket); eargs.ssocket = _ServerSocket; eargs.event = this; eargs.evpoll = &evpoll; Loading src/posix/tcp.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -197,7 +197,7 @@ size_t netplus::tcp::sendData(void* data, unsigned long size,int flags){ throw exception; } return (size_t) rval == 0 ? size : rval; return (size_t) rval; } Loading Loading @@ -225,7 +225,7 @@ size_t netplus::tcp::recvData(void* data, unsigned long size,int flags){ << " ErrorMsg: " << errstr; throw exception; } return (size_t)recvsize == 0 ? size : recvsize; return (size_t)recvsize; } void netplus::tcp::connect(socket *ssock){ Loading src/windows/tcp.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ void netplus::tcp::bind(){ size_t netplus::tcp::sendData(void* data, unsigned long size,int flags){ NetException exception; WSABUF buf; WSABUF buf{0}; buf.buf = (char*)data; buf.len = size; Loading @@ -190,7 +190,7 @@ SENDDATA: << " ErrorMsg: " << lerror; throw exception; } return (size_t) rval == 0 ? size : rval; return (size_t) rval; } size_t netplus::tcp::recvData(void* data, unsigned long size,int flags){ Loading Loading @@ -218,7 +218,7 @@ RECVDATA: throw exception; } return (size_t) recvsize == 0 ? size : recvsize; return (size_t) recvsize; } void netplus::tcp::connect(socket *ssock){ Loading Loading
cpp.hint 0 → 100644 +4 −0 Original line number Diff line number Diff line // Hinweisdateien unterstützen die Visual Studio-IDE beim Interpretiertieren von Visual C++-Bezeichnern, // z. B. von Namen der Funktionen und Makros. // Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=865984 #define BLOCKSIZE
src/event/iocp.cpp +44 −106 Original line number Diff line number Diff line Loading @@ -60,7 +60,6 @@ namespace netplus { client(eventapi* eapi) { api = eapi; api->CreateConnetion(&CurCon); OpCode = 0; }; ~client() { Loading @@ -68,7 +67,6 @@ namespace netplus { }; std::mutex ConLock; int OpCode; //will be used by the worker thread to decide what operation to perform eventapi* api; con* CurCon; }; Loading @@ -76,13 +74,7 @@ namespace netplus { class poll { public: enum states { OP_ACCEPT = 0, OP_READ = 1, OP_WRITE = 2 }; poll(HANDLE iocp, eventapi* api, socket* ssock) { poll(HANDLE iocp,std::mutex &amtx,eventapi* api, socket* ssock) : g_amtx (amtx){ g_iocp = iocp; g_eventapi = api; g_serversocket = ssock; Loading Loading @@ -120,8 +112,8 @@ namespace netplus { } void AcceptConnection(int tid, ULONG_PTR args) { g_amtx.lock(); client* pClientContext = new client(g_eventapi); pClientContext->OpCode = OP_ACCEPT; if (g_serversocket->_Type == TCP) pClientContext->CurCon->csock = new tcp; Loading @@ -129,6 +121,8 @@ namespace netplus { try { g_serversocket->accept(pClientContext->CurCon->csock); pClientContext->CurCon->csock->setFlag(FIONBIO, 0); //Store this object AddToClientList(pClientContext); Loading @@ -136,25 +130,34 @@ namespace netplus { } catch (NetException& e) { delete pClientContext->CurCon->csock; RemoveFromClientList(pClientContext); g_amtx.unlock(); throw e; } g_eventapi->ConnectEvent(pClientContext->CurCon, tid, args); g_amtx.unlock(); std::shared_ptr<char[]> buf(new char[BLOCKSIZE], std::default_delete<char[]>()); int recv = pClientContext->CurCon->csock->recvData(buf.get(), BLOCKSIZE, 0); size_t recv = pClientContext->CurCon->csock->recvData(buf.get(), BLOCKSIZE, 0); pClientContext->CurCon->RecvData.append(buf.get(), recv); } std::cerr.write(buf.get(), recv) << std::endl; g_eventapi->RequestEvent(pClientContext->CurCon, tid, args); } private: HANDLE g_iocp; socket* g_serversocket; eventapi* g_eventapi; std::vector<client*> g_ClientContext; std::mutex g_polllock; std::mutex& g_amtx; friend class client; friend class EventWorker; }; Loading Loading @@ -197,7 +200,7 @@ namespace netplus { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); threads = 2; // sysinfo.dwNumberOfProcessors; threads = sysinfo.dwNumberOfProcessors; } event::~event() { Loading Loading @@ -240,20 +243,7 @@ namespace netplus { DWORD ret = 0; ULONG ssize = 0; auto elock = [eargs](client* eclient) { // eargs->mtx->lock(); // eclient->ConLock.lock(); // eargs->mtx->unlock(); }; auto eunlock = [eargs](client* eclient) { //eargs->mtx->lock(); //eclient->ConLock.unlock(); // eargs->mtx->unlock(); }; for (;;) { int bReturn = GetQueuedCompletionStatus( eargs->eviocp, &dwBytesTransfered, Loading @@ -261,62 +251,42 @@ namespace netplus { &pOverlapped, WSA_INFINITE); if (!eargs->mtx->try_lock()) continue; if (lpContext == 0) { eargs->mtx->unlock(); continue; } pClientContext = (client*)lpContext; elock(pClientContext); if ((bReturn == 0) && (0 == dwBytesTransfered)) { eargs->evpoll->RemoveFromClientList(pClientContext); eargs->mtx->unlock(); continue; } std::cerr << pClientContext->OpCode << std::endl; switch (pClientContext->OpCode) { case poll::OP_ACCEPT: std::cout.write(pClientContext->CurCon->RecvData.data(), pClientContext->CurCon->RecvData.size()); try { eargs->event->ConnectEvent(pClientContext->CurCon, tid, args); eargs->event->RequestEvent(pClientContext->CurCon, tid, args); if (!((con*)pClientContext->CurCon)->SendData.empty()) { pClientContext->OpCode = poll::OP_READ; dwFlags = 0; ssize = BLOCKSIZE < pClientContext->CurCon->SendData.size() ? BLOCKSIZE : (ULONG)pClientContext->CurCon->SendData.size(); std::shared_ptr<char[]> buf(new char[16384], std::default_delete<char[]>()); pClientContext->OpCode = poll::OP_WRITE; //Overlapped send try { ret = pClientContext->CurCon->csock->sendData(buf.get(), ssize, 0); } catch (NetException& e) { eargs->evpoll->RemoveFromClientList(pClientContext); throw e; } ret = pClientContext->CurCon->csock->sendData(pClientContext->CurCon->SendData.data(), ssize, 0); pClientContext->CurCon->SendData.resize(ret); try { eargs->event->ResponseEvent(pClientContext->CurCon, tid, args); } } catch (NetException& e) { std::cerr << e.what() << std::endl; } break; case poll::OP_READ: try { } else { dwFlags = 0; std::shared_ptr<char[]> buf(new char[16384], std::default_delete<char[]>()); Loading @@ -329,46 +299,14 @@ namespace netplus { ret = pClientContext->CurCon->csock->sendData(buf.get(), ssize, 0); pClientContext->OpCode = poll::OP_WRITE; } catch (NetException& e) { std::cerr << e.what() << std::endl; } break; case poll::OP_WRITE: try { if(!((con*)pClientContext->CurCon)->SendData.empty()) { dwFlags = 0; ssize = BLOCKSIZE < pClientContext->CurCon->SendData.size() ? BLOCKSIZE : (ULONG)pClientContext->CurCon->SendData.size(); std::shared_ptr<char[]> buf(new char[16384], std::default_delete<char[]>()); //Overlapped send ret = pClientContext->CurCon->csock->sendData(buf.get(), ssize, 0); pClientContext->CurCon->SendData.resize(ret); try { eargs->event->ResponseEvent(pClientContext->CurCon, tid, args); } catch (NetException& e) { std::cerr << e.what() << std::endl; } } else { pClientContext->OpCode = poll::OP_READ; } } catch (NetException& e) { std::cerr << e.what() << std::endl; eargs->evpoll->RemoveFromClientList(pClientContext); } break; default: eargs->evpoll->RemoveFromClientList(pClientContext); break; } // switch eunlock(pClientContext); eargs->mtx->unlock(); } // while } }; Loading @@ -394,10 +332,10 @@ namespace netplus { memset(&olOverlap, 0, sizeof(olOverlap)); poll evpoll(iocp, this, _ServerSocket); std::mutex pmtx; poll evpoll(iocp,pmtx, this, _ServerSocket); eargs.ssocket = _ServerSocket; eargs.event = this; eargs.evpoll = &evpoll; Loading
src/posix/tcp.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -197,7 +197,7 @@ size_t netplus::tcp::sendData(void* data, unsigned long size,int flags){ throw exception; } return (size_t) rval == 0 ? size : rval; return (size_t) rval; } Loading Loading @@ -225,7 +225,7 @@ size_t netplus::tcp::recvData(void* data, unsigned long size,int flags){ << " ErrorMsg: " << errstr; throw exception; } return (size_t)recvsize == 0 ? size : recvsize; return (size_t)recvsize; } void netplus::tcp::connect(socket *ssock){ Loading
src/windows/tcp.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ void netplus::tcp::bind(){ size_t netplus::tcp::sendData(void* data, unsigned long size,int flags){ NetException exception; WSABUF buf; WSABUF buf{0}; buf.buf = (char*)data; buf.len = size; Loading @@ -190,7 +190,7 @@ SENDDATA: << " ErrorMsg: " << lerror; throw exception; } return (size_t) rval == 0 ? size : rval; return (size_t) rval; } size_t netplus::tcp::recvData(void* data, unsigned long size,int flags){ Loading Loading @@ -218,7 +218,7 @@ RECVDATA: throw exception; } return (size_t) recvsize == 0 ? size : recvsize; return (size_t) recvsize; } void netplus::tcp::connect(socket *ssock){ Loading