<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool]]></title><description><![CDATA[<p>Moin habe in meine Libnetplus das den Windows support hinzugefügt funktioniert auch leider nicht wenn ich mit dem wrk Tool um die 10000 Anfragen stelle dann friert die Queue ohne Meldung ein das Programm läuft weiter aber kann aber keine neuen Anfragen stellen:</p>
<p>Der Komplette Source code:<br />
<a href="https://tuxist.de/git/jan.koester/libnetplus" rel="nofollow">https://tuxist.de/git/jan.koester/libnetplus</a></p>
<p>Das Project mit dem ich getestet (httpsysinfo) habe:</p>
<p><a href="https://tuxist.de/git/jan.koester/libhttppp/-/tree/master/examples?ref_type=heads" rel="nofollow">https://tuxist.de/git/jan.koester/libhttppp/-/tree/master/examples?ref_type=heads</a></p>
<p>Der Event Code:</p>
<pre><code class="language-cpp">/*******************************************************************************
Copyright (c) 2014, Jan Koester jan.koester@gmx.net
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
	* Redistributions of source code must retain the above copyright
	  notice, this list of conditions and the following disclaimer.
	* Redistributions in binary form must reproduce the above copyright
	  notice, this list of conditions and the following disclaimer in the
	  documentation and/or other materials provided with the distribution.
	* Neither the name of the &lt;organization&gt; nor the
	  names of its contributors may be used to endorse or promote products
	  derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL &lt;COPYRIGHT HOLDER&gt; BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/

#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;chrono&gt;
#include &lt;memory&gt;
#include &lt;mutex&gt;
#include &lt;cstring&gt;

#include &lt;signal.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdint.h&gt;

#include &lt;winsock2.h&gt;
#include &lt;ws2ipdef.h&gt;
#include &lt;mswsock.h&gt;
#include &lt;strsafe.h&gt;

#include &lt;errno.h&gt;

#include &quot;socket.h&quot;
#include &quot;exception.h&quot;
#include &quot;eventapi.h&quot;
#include &quot;connection.h&quot;
#include &lt;assert.h&gt;

#define READEVENT 0
#define SENDEVENT 1

#define BLOCKSIZE 16384

namespace netplus {

	enum IOState {
		IO_READ_STATE = 0,
		IO_WRITE_STATE = 1,
		IO_CLOSE_STATE = 2
	};

	class client {
	public:
		client(eventapi* eapi) : api(eapi), State(IO_READ_STATE), CurCon(nullptr) {
			api-&gt;CreateConnetion(&amp;CurCon);
		}

		~client() {
			if (CurCon) {
				api-&gt;deleteConnetion(CurCon);
			}
		}

		int                State;
		eventapi*          api;
		con*               CurCon;
		mutable std::mutex cltmtx;
	};

	class poll {
	public:

		poll(HANDLE iocp, eventapi* api, socket* ssock)
			: g_iocp(iocp), g_eventapi(api), g_serversocket(ssock) {}

		void AddToClientList(client* pClientContext) {
			std::lock_guard&lt;std::mutex&gt; lock(g_ClientContextMutex);
			g_ClientContext.push_back(pClientContext);
		}

		void AssociateWithIOCP(client* pClientContext) {
			//Associate the socket with IOCP
			HANDLE giocp2 = CreateIoCompletionPort((HANDLE)(pClientContext)-&gt;CurCon-&gt;csock-&gt;fd(), g_iocp, (ULONG_PTR)pClientContext, 0);

			if (!giocp2 || g_iocp != giocp2) {
				DWORD err = GetLastError();
				NetException exp;
				exp[NetException::Error] &lt;&lt; &quot;AssociateWithIOCP fehlgeschlagen: Fehlercode &quot; &lt;&lt; err;
				throw exp;
			}
		}

		void RemoveFromClientList(client* pClientContext) {
			std::lock_guard&lt;std::mutex&gt; lock(g_ClientContextMutex);
			auto it = std::find(g_ClientContext.begin(), g_ClientContext.end(), pClientContext);
			if (it != g_ClientContext.end()) {
				g_ClientContext.erase(it);
				delete pClientContext;
			}
		}

		void AcceptConnection(LPFN_ACCEPTEX lpfnAcceptEx, int tid, ULONG_PTR args) {
			client* pClientContext = new client(g_eventapi);

			if (g_serversocket-&gt;_Type == TCP)
				pClientContext-&gt;CurCon-&gt;csock = new tcp();

			try {
				g_serversocket-&gt;accept(lpfnAcceptEx, pClientContext-&gt;CurCon-&gt;csock);

				pClientContext-&gt;CurCon-&gt;csock-&gt;setNonBlock();

				//Store this object
				AddToClientList(pClientContext);

				AssociateWithIOCP(pClientContext);
			} catch (NetException&amp; e) {
				delete pClientContext-&gt;CurCon-&gt;csock;
				RemoveFromClientList(pClientContext);
				throw e;
			}
			g_eventapi-&gt;ConnectEvent(pClientContext-&gt;CurCon, tid, args);

			try {
				size_t recv = pClientContext-&gt;CurCon-&gt;csock-&gt;recvData(nullptr, 0, 0);

				WSAResetEvent(pClientContext-&gt;CurCon-&gt;csock-&gt;_Overlapped.hEvent);

			} catch (NetException&amp; e) {
				std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
				if (e.getErrorType() != NetException::Note)
					throw e;
			}


		}

	private:
		HANDLE               g_iocp;
		socket*              g_serversocket;
		eventapi*            g_eventapi;
		std::vector&lt;client*&gt; g_ClientContext;
		std::mutex           g_ClientContextMutex; // NEU: mutex als Member
		friend class         client;
		friend class         EventWorker;
	};

	void eventapi::RequestEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::ResponseEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::ConnectEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::DisconnectEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::CreateConnetion(con** curcon) {
		*curcon = new con(this);
	};

	void eventapi::deleteConnetion(con* curcon) {
		delete curcon;
	};

	event::event(socket* serversocket, int timeout) {
		if (!serversocket) {
			NetException exp;
			exp[NetException::Critical] &lt;&lt; &quot;server socket empty!&quot;;
			throw exp;
		}
		_Timeout = timeout;
		_ServerSocket = serversocket;
		_ServerSocket-&gt;setNonBlock();
		_ServerSocket-&gt;bind();
		_ServerSocket-&gt;listen();

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

	event::~event() {
	}


	class EventWorkerArgs {
	public:
		EventWorkerArgs() {
		}

		EventWorkerArgs(const EventWorkerArgs&amp; eargs) {
			event = eargs.event;
			eviocp = eargs.eviocp;
			evpoll = eargs.evpoll;
			ssocket = eargs.ssocket;
			timeout = eargs.timeout;
			args = eargs.args;
		}


		int         timeout;
		HANDLE      eviocp;
		poll* evpoll;
		eventapi* event;
		socket* ssocket;
		void* args;
	};

	class EventWorker {
	public:
		EventWorker(int tid, ULONG_PTR args, EventWorkerArgs* eargs) {
			for (;;) {
				ULONG_PTR   lpContext = 0;
				OVERLAPPED* pOverlapped = nullptr;
				DWORD       dwBytesTransfered = 0;

				bool bReturn = GetQueuedCompletionStatus(
					eargs-&gt;eviocp,
					&amp;dwBytesTransfered,
					&amp;lpContext,
					&amp;pOverlapped,
					WSA_INFINITE);

				if (lpContext == 0) {
					continue;
				}

				client* pClientContext = (client*)lpContext;

				if (!bReturn &amp;&amp; dwBytesTransfered == 0) {
					eargs-&gt;evpoll-&gt;RemoveFromClientList(pClientContext);
					continue;
				}

				try {
					auto&amp; curCon = pClientContext-&gt;CurCon;

					switch (pClientContext-&gt;State) {
						case IO_WRITE_STATE: {
							std::lock_guard&lt;std::mutex&gt; lock(pClientContext-&gt;cltmtx);
							eargs-&gt;event-&gt;ResponseEvent(curCon, tid, args);

							ULONG ssize = curCon-&gt;SendData.size() &lt; BLOCKSIZE ? (ULONG)curCon-&gt;SendData.size() : BLOCKSIZE;
							DWORD ret = 0;
							ret = curCon-&gt;csock-&gt;sendData(curCon-&gt;SendData.data(), ssize, 0);
							curCon-&gt;SendData.resize(ret);
							if (curCon-&gt;SendData.empty())
								pClientContext-&gt;State = IO_READ_STATE;
						}break;
						case IO_READ_STATE: {
							std::lock_guard&lt;std::mutex&gt; lock(pClientContext-&gt;cltmtx);
							std::shared_ptr&lt;char[]&gt; buf(new char[BLOCKSIZE], std::default_delete&lt;char[]&gt;());
							size_t recv = curCon-&gt;csock-&gt;recvData(buf.get(), BLOCKSIZE, 0);
							curCon-&gt;RecvData.append(buf.get(), recv);

							eargs-&gt;event-&gt;RequestEvent(curCon, tid, args);
							if (!curCon-&gt;SendData.empty())
								pClientContext-&gt;State = IO_WRITE_STATE;
						}break;
						case IO_CLOSE_STATE: {
							WSACloseEvent(pClientContext-&gt;CurCon-&gt;csock-&gt;_Overlapped.hEvent);
							eargs-&gt;evpoll-&gt;RemoveFromClientList(pClientContext);
						}continue;
					}
					WSAResetEvent(pClientContext-&gt;CurCon-&gt;csock-&gt;_Overlapped.hEvent);
				} catch (NetException&amp; e) {
					std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
					if (e.getErrorType() != NetException::Note) {
						pClientContext-&gt;State = IO_CLOSE_STATE;
						continue;
					}
				} catch (...) {
					std::cerr &lt;&lt; &quot;unknown error close coonection !&quot; &lt;&lt; std::endl;
					pClientContext-&gt;State = IO_CLOSE_STATE;
					continue;
				}
				
			} // for
		}
	};



	void event::runEventloop(ULONG_PTR args) {
		NetException exception;
		EventWorkerArgs eargs;

		HANDLE iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);

		if (!iocp) {
			NetException exp;
			exp[NetException::Critical] &lt;&lt; &quot;event: runEventloop couldn't create iocp !&quot;;
			throw exp;
		}

		LPFN_ACCEPTEX lpfnAcceptEx = NULL;
		GUID GuidAcceptEx = WSAID_ACCEPTEX;
		WSAOVERLAPPED olOverlap;
		DWORD dwBytes;

		memset(&amp;olOverlap, 0, sizeof(olOverlap));

		poll evpoll(iocp, this, _ServerSocket);

		eargs.ssocket = _ServerSocket;
		eargs.event = this;
		eargs.evpoll = &amp;evpoll;
		eargs.timeout = _Timeout;
		eargs.eviocp = iocp;

		std::vector &lt;std::thread&gt; threadpool;

		for (int i = 0; i &lt; threads; i++) {
			try {
				threadpool.push_back(std::thread([&amp;eargs, args, i] {
					EventWorker(i, args, &amp;eargs);
					}));
			}
			catch (NetException&amp; e) {
				throw e;
			}
		}

		int iResult = WSAIoctl(_ServerSocket-&gt;fd(), SIO_GET_EXTENSION_FUNCTION_POINTER,
			&amp;GuidAcceptEx, sizeof(GuidAcceptEx),
			&amp;lpfnAcceptEx, sizeof(lpfnAcceptEx),
			&amp;dwBytes, NULL, NULL);

		if (iResult == SOCKET_ERROR) {
			NetException exp;
			exp[NetException::Critical] &lt;&lt; &quot;WSAIoctl failed with error: &quot; &lt;&lt; WSAGetLastError();
			closesocket(_ServerSocket-&gt;fd());
			WSACleanup();
			throw exp;
		}

		WSAEVENT g_hAcceptEvent = WSACreateEvent();
		WSANETWORKEVENTS WSAEvents;

		if (WSA_INVALID_EVENT == g_hAcceptEvent) {
			NetException exp;
			exp[NetException::Error] &lt;&lt; &quot;Error occurred while WSACreateEvent().&quot;;
			throw exp;
		}

		if (SOCKET_ERROR == WSAEventSelect(_ServerSocket-&gt;fd(), g_hAcceptEvent, FD_ACCEPT | FD_READ | FD_WRITE)) {
			NetException exp;
			exp[NetException::Error] &lt;&lt; &quot;Error occurred while WSAEventSelect().&quot;;
			WSACloseEvent(g_hAcceptEvent);
			throw exp;
		}

		for (;;) {
			if (WSA_WAIT_FAILED != WSAWaitForMultipleEvents(1, &amp;g_hAcceptEvent, FALSE, WSA_INFINITE, FALSE)) {
				WSAEnumNetworkEvents(_ServerSocket-&gt;fd(), g_hAcceptEvent, &amp;WSAEvents);
				if ((WSAEvents.lNetworkEvents &amp; FD_ACCEPT) &amp;&amp; (0 == WSAEvents.iErrorCode[FD_ACCEPT_BIT])) {
					try {
						evpoll.AcceptConnection(lpfnAcceptEx,0, args);
					} catch (NetException&amp; e) {
						std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
					}
				}
			}
		}

		for (auto i = threadpool.begin(); i != threadpool.end(); ++i) {
			i-&gt;join();
		}
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/355329/probleme-iocp-queue-bleibt-hängen-mit-wrk-penetration-tool</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 09:12:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/355329.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Jul 2025 06:52:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Wed, 02 Jul 2025 06:52:45 GMT]]></title><description><![CDATA[<p>Moin habe in meine Libnetplus das den Windows support hinzugefügt funktioniert auch leider nicht wenn ich mit dem wrk Tool um die 10000 Anfragen stelle dann friert die Queue ohne Meldung ein das Programm läuft weiter aber kann aber keine neuen Anfragen stellen:</p>
<p>Der Komplette Source code:<br />
<a href="https://tuxist.de/git/jan.koester/libnetplus" rel="nofollow">https://tuxist.de/git/jan.koester/libnetplus</a></p>
<p>Das Project mit dem ich getestet (httpsysinfo) habe:</p>
<p><a href="https://tuxist.de/git/jan.koester/libhttppp/-/tree/master/examples?ref_type=heads" rel="nofollow">https://tuxist.de/git/jan.koester/libhttppp/-/tree/master/examples?ref_type=heads</a></p>
<p>Der Event Code:</p>
<pre><code class="language-cpp">/*******************************************************************************
Copyright (c) 2014, Jan Koester jan.koester@gmx.net
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
	* Redistributions of source code must retain the above copyright
	  notice, this list of conditions and the following disclaimer.
	* Redistributions in binary form must reproduce the above copyright
	  notice, this list of conditions and the following disclaimer in the
	  documentation and/or other materials provided with the distribution.
	* Neither the name of the &lt;organization&gt; nor the
	  names of its contributors may be used to endorse or promote products
	  derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL &lt;COPYRIGHT HOLDER&gt; BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/

#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;chrono&gt;
#include &lt;memory&gt;
#include &lt;mutex&gt;
#include &lt;cstring&gt;

#include &lt;signal.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdint.h&gt;

#include &lt;winsock2.h&gt;
#include &lt;ws2ipdef.h&gt;
#include &lt;mswsock.h&gt;
#include &lt;strsafe.h&gt;

#include &lt;errno.h&gt;

#include &quot;socket.h&quot;
#include &quot;exception.h&quot;
#include &quot;eventapi.h&quot;
#include &quot;connection.h&quot;
#include &lt;assert.h&gt;

#define READEVENT 0
#define SENDEVENT 1

#define BLOCKSIZE 16384

namespace netplus {

	enum IOState {
		IO_READ_STATE = 0,
		IO_WRITE_STATE = 1,
		IO_CLOSE_STATE = 2
	};

	class client {
	public:
		client(eventapi* eapi) : api(eapi), State(IO_READ_STATE), CurCon(nullptr) {
			api-&gt;CreateConnetion(&amp;CurCon);
		}

		~client() {
			if (CurCon) {
				api-&gt;deleteConnetion(CurCon);
			}
		}

		int                State;
		eventapi*          api;
		con*               CurCon;
		mutable std::mutex cltmtx;
	};

	class poll {
	public:

		poll(HANDLE iocp, eventapi* api, socket* ssock)
			: g_iocp(iocp), g_eventapi(api), g_serversocket(ssock) {}

		void AddToClientList(client* pClientContext) {
			std::lock_guard&lt;std::mutex&gt; lock(g_ClientContextMutex);
			g_ClientContext.push_back(pClientContext);
		}

		void AssociateWithIOCP(client* pClientContext) {
			//Associate the socket with IOCP
			HANDLE giocp2 = CreateIoCompletionPort((HANDLE)(pClientContext)-&gt;CurCon-&gt;csock-&gt;fd(), g_iocp, (ULONG_PTR)pClientContext, 0);

			if (!giocp2 || g_iocp != giocp2) {
				DWORD err = GetLastError();
				NetException exp;
				exp[NetException::Error] &lt;&lt; &quot;AssociateWithIOCP fehlgeschlagen: Fehlercode &quot; &lt;&lt; err;
				throw exp;
			}
		}

		void RemoveFromClientList(client* pClientContext) {
			std::lock_guard&lt;std::mutex&gt; lock(g_ClientContextMutex);
			auto it = std::find(g_ClientContext.begin(), g_ClientContext.end(), pClientContext);
			if (it != g_ClientContext.end()) {
				g_ClientContext.erase(it);
				delete pClientContext;
			}
		}

		void AcceptConnection(LPFN_ACCEPTEX lpfnAcceptEx, int tid, ULONG_PTR args) {
			client* pClientContext = new client(g_eventapi);

			if (g_serversocket-&gt;_Type == TCP)
				pClientContext-&gt;CurCon-&gt;csock = new tcp();

			try {
				g_serversocket-&gt;accept(lpfnAcceptEx, pClientContext-&gt;CurCon-&gt;csock);

				pClientContext-&gt;CurCon-&gt;csock-&gt;setNonBlock();

				//Store this object
				AddToClientList(pClientContext);

				AssociateWithIOCP(pClientContext);
			} catch (NetException&amp; e) {
				delete pClientContext-&gt;CurCon-&gt;csock;
				RemoveFromClientList(pClientContext);
				throw e;
			}
			g_eventapi-&gt;ConnectEvent(pClientContext-&gt;CurCon, tid, args);

			try {
				size_t recv = pClientContext-&gt;CurCon-&gt;csock-&gt;recvData(nullptr, 0, 0);

				WSAResetEvent(pClientContext-&gt;CurCon-&gt;csock-&gt;_Overlapped.hEvent);

			} catch (NetException&amp; e) {
				std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
				if (e.getErrorType() != NetException::Note)
					throw e;
			}


		}

	private:
		HANDLE               g_iocp;
		socket*              g_serversocket;
		eventapi*            g_eventapi;
		std::vector&lt;client*&gt; g_ClientContext;
		std::mutex           g_ClientContextMutex; // NEU: mutex als Member
		friend class         client;
		friend class         EventWorker;
	};

	void eventapi::RequestEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::ResponseEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::ConnectEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::DisconnectEvent(con* curcon, const int tid, ULONG_PTR args) {
		//dummy
	};

	void eventapi::CreateConnetion(con** curcon) {
		*curcon = new con(this);
	};

	void eventapi::deleteConnetion(con* curcon) {
		delete curcon;
	};

	event::event(socket* serversocket, int timeout) {
		if (!serversocket) {
			NetException exp;
			exp[NetException::Critical] &lt;&lt; &quot;server socket empty!&quot;;
			throw exp;
		}
		_Timeout = timeout;
		_ServerSocket = serversocket;
		_ServerSocket-&gt;setNonBlock();
		_ServerSocket-&gt;bind();
		_ServerSocket-&gt;listen();

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

	event::~event() {
	}


	class EventWorkerArgs {
	public:
		EventWorkerArgs() {
		}

		EventWorkerArgs(const EventWorkerArgs&amp; eargs) {
			event = eargs.event;
			eviocp = eargs.eviocp;
			evpoll = eargs.evpoll;
			ssocket = eargs.ssocket;
			timeout = eargs.timeout;
			args = eargs.args;
		}


		int         timeout;
		HANDLE      eviocp;
		poll* evpoll;
		eventapi* event;
		socket* ssocket;
		void* args;
	};

	class EventWorker {
	public:
		EventWorker(int tid, ULONG_PTR args, EventWorkerArgs* eargs) {
			for (;;) {
				ULONG_PTR   lpContext = 0;
				OVERLAPPED* pOverlapped = nullptr;
				DWORD       dwBytesTransfered = 0;

				bool bReturn = GetQueuedCompletionStatus(
					eargs-&gt;eviocp,
					&amp;dwBytesTransfered,
					&amp;lpContext,
					&amp;pOverlapped,
					WSA_INFINITE);

				if (lpContext == 0) {
					continue;
				}

				client* pClientContext = (client*)lpContext;

				if (!bReturn &amp;&amp; dwBytesTransfered == 0) {
					eargs-&gt;evpoll-&gt;RemoveFromClientList(pClientContext);
					continue;
				}

				try {
					auto&amp; curCon = pClientContext-&gt;CurCon;

					switch (pClientContext-&gt;State) {
						case IO_WRITE_STATE: {
							std::lock_guard&lt;std::mutex&gt; lock(pClientContext-&gt;cltmtx);
							eargs-&gt;event-&gt;ResponseEvent(curCon, tid, args);

							ULONG ssize = curCon-&gt;SendData.size() &lt; BLOCKSIZE ? (ULONG)curCon-&gt;SendData.size() : BLOCKSIZE;
							DWORD ret = 0;
							ret = curCon-&gt;csock-&gt;sendData(curCon-&gt;SendData.data(), ssize, 0);
							curCon-&gt;SendData.resize(ret);
							if (curCon-&gt;SendData.empty())
								pClientContext-&gt;State = IO_READ_STATE;
						}break;
						case IO_READ_STATE: {
							std::lock_guard&lt;std::mutex&gt; lock(pClientContext-&gt;cltmtx);
							std::shared_ptr&lt;char[]&gt; buf(new char[BLOCKSIZE], std::default_delete&lt;char[]&gt;());
							size_t recv = curCon-&gt;csock-&gt;recvData(buf.get(), BLOCKSIZE, 0);
							curCon-&gt;RecvData.append(buf.get(), recv);

							eargs-&gt;event-&gt;RequestEvent(curCon, tid, args);
							if (!curCon-&gt;SendData.empty())
								pClientContext-&gt;State = IO_WRITE_STATE;
						}break;
						case IO_CLOSE_STATE: {
							WSACloseEvent(pClientContext-&gt;CurCon-&gt;csock-&gt;_Overlapped.hEvent);
							eargs-&gt;evpoll-&gt;RemoveFromClientList(pClientContext);
						}continue;
					}
					WSAResetEvent(pClientContext-&gt;CurCon-&gt;csock-&gt;_Overlapped.hEvent);
				} catch (NetException&amp; e) {
					std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
					if (e.getErrorType() != NetException::Note) {
						pClientContext-&gt;State = IO_CLOSE_STATE;
						continue;
					}
				} catch (...) {
					std::cerr &lt;&lt; &quot;unknown error close coonection !&quot; &lt;&lt; std::endl;
					pClientContext-&gt;State = IO_CLOSE_STATE;
					continue;
				}
				
			} // for
		}
	};



	void event::runEventloop(ULONG_PTR args) {
		NetException exception;
		EventWorkerArgs eargs;

		HANDLE iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);

		if (!iocp) {
			NetException exp;
			exp[NetException::Critical] &lt;&lt; &quot;event: runEventloop couldn't create iocp !&quot;;
			throw exp;
		}

		LPFN_ACCEPTEX lpfnAcceptEx = NULL;
		GUID GuidAcceptEx = WSAID_ACCEPTEX;
		WSAOVERLAPPED olOverlap;
		DWORD dwBytes;

		memset(&amp;olOverlap, 0, sizeof(olOverlap));

		poll evpoll(iocp, this, _ServerSocket);

		eargs.ssocket = _ServerSocket;
		eargs.event = this;
		eargs.evpoll = &amp;evpoll;
		eargs.timeout = _Timeout;
		eargs.eviocp = iocp;

		std::vector &lt;std::thread&gt; threadpool;

		for (int i = 0; i &lt; threads; i++) {
			try {
				threadpool.push_back(std::thread([&amp;eargs, args, i] {
					EventWorker(i, args, &amp;eargs);
					}));
			}
			catch (NetException&amp; e) {
				throw e;
			}
		}

		int iResult = WSAIoctl(_ServerSocket-&gt;fd(), SIO_GET_EXTENSION_FUNCTION_POINTER,
			&amp;GuidAcceptEx, sizeof(GuidAcceptEx),
			&amp;lpfnAcceptEx, sizeof(lpfnAcceptEx),
			&amp;dwBytes, NULL, NULL);

		if (iResult == SOCKET_ERROR) {
			NetException exp;
			exp[NetException::Critical] &lt;&lt; &quot;WSAIoctl failed with error: &quot; &lt;&lt; WSAGetLastError();
			closesocket(_ServerSocket-&gt;fd());
			WSACleanup();
			throw exp;
		}

		WSAEVENT g_hAcceptEvent = WSACreateEvent();
		WSANETWORKEVENTS WSAEvents;

		if (WSA_INVALID_EVENT == g_hAcceptEvent) {
			NetException exp;
			exp[NetException::Error] &lt;&lt; &quot;Error occurred while WSACreateEvent().&quot;;
			throw exp;
		}

		if (SOCKET_ERROR == WSAEventSelect(_ServerSocket-&gt;fd(), g_hAcceptEvent, FD_ACCEPT | FD_READ | FD_WRITE)) {
			NetException exp;
			exp[NetException::Error] &lt;&lt; &quot;Error occurred while WSAEventSelect().&quot;;
			WSACloseEvent(g_hAcceptEvent);
			throw exp;
		}

		for (;;) {
			if (WSA_WAIT_FAILED != WSAWaitForMultipleEvents(1, &amp;g_hAcceptEvent, FALSE, WSA_INFINITE, FALSE)) {
				WSAEnumNetworkEvents(_ServerSocket-&gt;fd(), g_hAcceptEvent, &amp;WSAEvents);
				if ((WSAEvents.lNetworkEvents &amp; FD_ACCEPT) &amp;&amp; (0 == WSAEvents.iErrorCode[FD_ACCEPT_BIT])) {
					try {
						evpoll.AcceptConnection(lpfnAcceptEx,0, args);
					} catch (NetException&amp; e) {
						std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
					}
				}
			}
		}

		for (auto i = threadpool.begin(); i != threadpool.end(); ++i) {
			i-&gt;join();
		}
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2624030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624030</guid><dc:creator><![CDATA[Tuxist1]]></dc:creator><pubDate>Wed, 02 Jul 2025 06:52:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Wed, 02 Jul 2025 07:18:29 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/37146">@Tuxist1</a> sagte in <a href="/forum/post/2624030">Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool</a>:</p>
<blockquote>
<p>Moin habe in meine Libnetplus das den Windows support hinzugefügt funktioniert auch leider nicht wenn ich mit dem wrk Tool um die 10000 Anfragen stelle dann friert die Queue ohne Meldung ein das Programm läuft weiter aber kann aber keine neuen Anfragen stellen:</p>
</blockquote>
<p>Sorry, aber was willst du damit sagen? Ich verstehe da gerade gar nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2624031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624031</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Wed, 02 Jul 2025 07:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Wed, 02 Jul 2025 08:45:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/35432">@Quiche-Lorraine</a> wrk ist ein Benchmarktool für Httprequests bringt leider meine iocp layer ins straucheln so das er nicht mehr antwortet hatte schon Vermutung das was mit den Sockets zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2624032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624032</guid><dc:creator><![CDATA[Tuxist1]]></dc:creator><pubDate>Wed, 02 Jul 2025 08:45:31 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Wed, 02 Jul 2025 16:18:46 GMT]]></title><description><![CDATA[<p>geht jetzt werde noch bißchen weiter testen.</p>
<pre><code class="language-cpp">		void RemoveFromClientList(client* pClientContext) {
			std::lock_guard&lt;std::mutex&gt; lock(g_ClientContextMutex);
			auto it = std::find(g_ClientContext.begin(), g_ClientContext.end(), pClientContext);
			if (it != g_ClientContext.end()) {
				if (pClientContext-&gt;cltmtx.try_lock()) {
					pClientContext-&gt;cltmtx.unlock();
					g_ClientContext.erase(it);
				}				
			}
		}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2624033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624033</guid><dc:creator><![CDATA[Tuxist1]]></dc:creator><pubDate>Wed, 02 Jul 2025 16:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Thu, 03 Jul 2025 07:01:29 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/37146">@Tuxist1</a> sagte in <a href="/forum/post/2624032">Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool</a>:</p>
<blockquote>
<p>wrk ist ein Benchmarktool für Httprequests bringt leider meine iocp layer ins straucheln so das er nicht mehr antwortet hatte schon Vermutung das was mit den Sockets zu tun hat.</p>
</blockquote>
<p>Sorry wenn ich das mal sage. Aber dein Schreibstil ist mir zu hektisch.</p>
<p>Ich vermute mal dass du einen Belastungstest durchgeführt hast und dadurch dein Code hängenbleibt.</p>
<p>Ein paar Punkte:</p>
<ul>
<li>
<p>Dein komplettes Klassendesign gefällt mir nicht. Du nutzt sehr viele Pointer. Gerade in Sachen Threading ist dies nicht sinnvoll, da Verantwortlichkeiten nicht geklärt sind. Wer darf z.B. auf <code>client-&gt;api</code> zugreifen? Ist dieser Zugriff Thread Safe? Generell versuche ich für jeden  Thread die Daten so lokal wie möglich zu halten.</p>
</li>
<li>
<p>Warum nutzt du manuelle Speicherverwaltung? So etwas ist fehleranfällig und unnötig.</p>
</li>
<li>
<p>Achte bitte strikt auf Rückgabewerte. Folgender Code sieht strange aus:</p>
</li>
</ul>
<pre><code class="language-cpp">bool bReturn = GetQueuedCompletionStatus(
	eargs-&gt;eviocp,
	&amp;dwBytesTransfered,
	&amp;lpContext,
	&amp;pOverlapped,
	WSA_INFINITE);
// Annahme bReturn ist false, dann darf die Funktion GetQueuedCompletionStatus
// nach deinem Code pOverlapped nicht verändern. Kannst du das garantieren?
if (lpContext == 0) {
	continue;
}
client* pClientContext = (client*)lpContext;
if (!bReturn &amp;&amp; dwBytesTransfered == 0) {  // Gibt es auch den Zustand dass bReturn false ist, aber dwBytesTransfered &gt; 0?
	eargs-&gt;evpoll-&gt;RemoveFromClientList(pClientContext);
	continue;
}
</code></pre>
<ul>
<li>Ich würde dir auch empfehlen Logging zu nutzen. Beachte bitte aber dass Logging das Verhalten beeinflusst, da die Ausgabe ein paar Millisekunden fressen wird.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2624034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624034</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Thu, 03 Jul 2025 07:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Sat, 05 Jul 2025 07:36:37 GMT]]></title><description><![CDATA[<p>es wird noch ominöser haben jetzt auf anderen Rechner getestet mit Windows 11 Enterprise 24H2 der hat keine Probleme nur der mit Windows 11 IOT Enterprise 25H1 der schließt aus irgendeinem Grund keine Sockets habe ich durchs Logging heraus gefunden. Hat jemand eine Idee über die mögliche Ursache ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2624044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624044</guid><dc:creator><![CDATA[Tuxist1]]></dc:creator><pubDate>Sat, 05 Jul 2025 07:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Sat, 05 Jul 2025 08:10:55 GMT]]></title><description><![CDATA[<p>ich glaube ich habe die Lösung der virtio win netzwerk treiber scheint fehlerhaft zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2624045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624045</guid><dc:creator><![CDATA[Tuxist1]]></dc:creator><pubDate>Sat, 05 Jul 2025 08:10:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool on Mon, 07 Jul 2025 08:31:55 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/37146">@Tuxist1</a> sagte in <a href="/forum/post/2624044">Probleme IOCP Queue bleibt hängen mit WRK Penetration Tool</a>:</p>
<blockquote>
<p>es wird noch ominöser haben jetzt auf anderen Rechner getestet mit Windows 11 Enterprise 24H2 der hat keine Probleme nur der mit Windows 11 IOT Enterprise 25H1 der schließt aus irgendeinem Grund keine Sockets habe ich durchs Logging heraus gefunden. Hat jemand eine Idee über die mögliche Ursache ?</p>
</blockquote>
<p>Was sagt der Rückgabewert von <code>closesocket()</code> bzw. <code>WSAGetLastError</code>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2624047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2624047</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Mon, 07 Jul 2025 08:31:55 GMT</pubDate></item></channel></rss>