Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Enclave: C++ network library

Enclave is a small C++ network library which is based on Qt framework. This library has next advantages:

  • multithreading server
  • optional encryption mode
  • network streams with request/response model
  • simple and intuitive API

Requirements

Qt 5+ (core and network modules) and any modern C++ compiler with support C++11.

Introduction

Project structure:

DirectoryDescription
benchmark/Benchmark for testing library perfomance
enclave/Library
example-chat/Simple chat based on this library

Architecture

This library internally use QTcpServer for server and QSslSocket (in both encryption and unecryption modes) for server and client connections. Network sockets are lived in separate threads - one thread on client and one or more threads on server (threads count depends on server thread policy). Interaction with user code occurs via Qt signal/slot mechanism and special classes which make safe using of internal structures. For transfer and receive data library provides abstraction of network socket with convenient interface - network streams.

How to use

The main two classes are Enclave::Server and Enclave::Client. Aggregation is prefer but you can also use inheritance. For interaction with its classes you have to connect to following signals. Notice that even if you set ignored SSL errors the signal errorSignal will be emitted (with flag ignored = true).

Server
SignalDescription
connectionEstablishedSignalEmit when client connection was established
connectionClosedSignalEmit when client connection was closed
dataReceivedSignalEmit when network client data was received
errorSignalEmit when error happened
Client
SignalDescription
connectedSignalEmit when client was connected
disconnectedSignalEmit when client connection was closed
dataReceivedSignalEmit when network server data was received
errorSignalEmit when error happened

Before starting client or server you can set encryption options and set appropriate thread policy (for server only).

Essential classes

Working with this library is provided by next essential classes.

NetworkConnection

It's wrapper of server or client connection. You can safely use methods of this class even if connection has already disappeared. The main method for network interaction is createStream. It create new network stream for specified command which you can use for send network data. Overloaded function have callback as parameter which will be executed when request of another network node will be received:

  • node one create stream with callback
  • node one put data to stream and send request
  • node two receive data as stream and create response stream
  • node two put data to stream and send response
  • node one callback is executed
NetworkStream

This class give abstraction for sending and receiving network data.

Benchmark

With console benchmark you can comparsion performance of different server thread policies.

Chat example

This simple chat example illustrate usage of Enclave library. If you want to run it you should set working directory enclave/example-chat/workdir.

Commands for create necessary certificates of this example:

# private key for root CA certificate
openssl genrsa -out ca.key 4096
# self-signed root CA certificate
openssl req -new -x509 -days 730 -key ca.key -out ca.crt
# private key for server certificate
openssl genrsa -out server.key 4096
# request a server certificate
openssl req -new -key server.key -out server.csr
# server certificate by request
openssl x509 -req -days 730 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# private key for client certificate
openssl genrsa -out client.key 4096
# request a client certificate
openssl req -new -key client.key -out client.csr
# client certificate by request
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

About

C++/Qt network library

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages