Commit 3e8b4900 authored by jan.koester's avatar jan.koester
Browse files

importand changes

parent 3577f3cb
Loading
Loading
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
+44 −106
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@ namespace netplus {
		client(eventapi* eapi) {
			api = eapi;
			api->CreateConnetion(&CurCon);
			OpCode = 0;			
		};

		~client() {
@@ -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;
	};
@@ -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;
@@ -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;
@@ -129,6 +121,8 @@ namespace netplus {
			try {
				g_serversocket->accept(pClientContext->CurCon->csock);

				pClientContext->CurCon->csock->setFlag(FIONBIO, 0);

				//Store this object
				AddToClientList(pClientContext);

@@ -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;
	};
@@ -197,7 +200,7 @@ namespace netplus {

		SYSTEM_INFO sysinfo;
		GetSystemInfo(&sysinfo);
		threads = 2; // sysinfo.dwNumberOfProcessors;
		threads = sysinfo.dwNumberOfProcessors;
	}

	event::~event() {
@@ -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,
@@ -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[]>());
@@ -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
		}
	};
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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;
}


@@ -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){
+3 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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){
@@ -218,7 +218,7 @@ RECVDATA:
        throw exception;
    }

    return (size_t) recvsize == 0 ? size : recvsize;
    return (size_t) recvsize;
}

void netplus::tcp::connect(socket *ssock){