Page:
n__network__msg_8c
Pages
Examples
Files
Home
Module AABB3D
Module ACCEPT_POOL
Module ALLEGRO4
Module ALLEGRO5
Module ANIM_LIB
Module ASTAR
Module ATLAS_LIB
Module AVRO
Module CLOCK_SYNC
Module COMMONS
Module CONFIGFILE
Module CYPHER_BASE64
Module CYPHER_VIGENERE
Module DEAD_RECKONING
Module ENUMS
Module EXCEPTIONS
Module GAME_ENV
Module GIT
Module GUI
Module HASH_TABLE
Module ISOMETRIC_ENGINE
Module LIST
Module LOG
Module LOGNODUP
Module LZ4
Module NETWORKING
Module NETWORK_MSG
Module N_COOKIES
Module N_DIFF
Module N_DIGEST
Module N_DISK_CACHE
Module N_DNS
Module N_ECC
Module N_ENTROPY
Module N_FILES
Module N_FLUIDS
Module N_GUI_COLOR
Module N_GUI_COLORWHEEL
Module N_GUI_CURVE
Module N_GUI_GRID
Module N_GUI_POPUP
Module N_HEX
Module N_HTTP3
Module N_HTTP_COOKIE
Module N_HTTP_FORM
Module N_HTTP_MIME
Module N_HTTP_REQ
Module N_HTTP_RESP
Module N_HTTP_ROUTER
Module N_HTTP_SERVER
Module N_ICC
Module N_JSON
Module N_KAFKA
Module N_LINALG
Module N_MODULE
Module N_OPENSSL_COMPAT
Module N_PRETTY
Module N_PTH
Module N_QUERY
Module N_RANDOM
Module N_SHA256
Module N_STR
Module N_TIFF
Module N_TIME
Module N_USER
Module N_X509
Module N_ZIP
Module PARTICLES
Module PCRE
Module PHYSICS
Module SIGNALS
Module STACK
Module THREADS
Module TRAJECTORY
Module TREE
Module ZLIB
Modules
Pages
Struct A4_BMP
Struct A4_TIMER
Struct AABB3D
Struct ANIM_DATA
Struct ANIM_FRAME
Struct ANIM_GFX
Struct ANIM_LIB
Struct ASTAR_BOX
Struct ASTAR_CELL
Struct ASTAR_GRID
Struct ASTAR_HEAP
Struct ASTAR_HEAP_NODE
Struct ASTAR_NODE
Struct ASTAR_PATH
Struct AVRO_FIELD
Struct AVRO_READER
Struct AVRO_SCHEMA
Struct BITMAP
Struct CALLBACK_DATA
Struct CA_CTX
Struct CLIENT_JOB
Struct CLIENT_STATE
Struct CONFIG_FILE
Struct CONFIG_FILE_SECTION
Struct CYPHER_PARAM
Struct DATA
Struct DEMO_PANEL
Struct DICTIONARY_DEFINITION
Struct DICTIONARY_ENTRY
Struct DIFF_OUT
Struct DIFF_TEXT
Struct DRAW_STATE
Struct DR_ENTITY
Struct DR_STATE
Struct DR_VEC3
Struct ExceptionContextList
Struct FONT
Struct GAME_ENV
Struct H2BUF
Struct H2_DYN_ENTRY
Struct H2_STREAM
Struct HASH_NODE
Struct HASH_TABLE
Struct ISO_DRAW_ENTRY
Struct ISO_MAP
Struct ISO_PROJECTION
Struct ISO_TILE_SEGMENT
Struct ISO_TILE_SEGMENTS
Struct ISO_VISIBLE_EDGES
Struct JS_STATE
Struct LEX_ITEM
Struct LIST
Struct LIST_NODE
Struct LOG_LEVELS
Struct LexMenu
Struct MEMBER
Struct MIDI
Struct NESTED
Struct NETWORK
Struct NETWORK_HTTP_INFO
Struct NETWORK_POOL
Struct NETWORK_SSL_THREAD_PARAMS
Struct NETW_ACCEPT_POOL
Struct NETW_ACCEPT_POOL_STATS
Struct NETW_MSG
Struct NETW_SNI_ARG
Struct NODE_DATA
Struct N_ATLAS
Struct N_ATLAS_PAGE
Struct N_CLOCK_SYNC
Struct N_COOKIE
Struct N_COOKIE_JAR
Struct N_DIFF_LINE
Struct N_DIFF_RESULT
Struct N_DISK_CACHE
Struct N_ENTROPY_BIT
Struct N_ENTROPY_POS
Struct N_FILE_INFO
Struct N_FLUID
Struct N_FLUID_THREAD_PARAMS
Struct N_FORM_FIELD
Struct N_GIT_COMMIT_INFO
Struct N_GIT_REMOTE_AUTH
Struct N_GIT_REPO
Struct N_GIT_STATUS_ENTRY
Struct N_GUI_BUTTON_DATA
Struct N_GUI_CHECKBOX_DATA
Struct N_GUI_COLOR_PICKER
Struct N_GUI_COMBOBOX_DATA
Struct N_GUI_CTX
Struct N_GUI_CUSTOM_DATA
Struct N_GUI_DATAGRID_COL
Struct N_GUI_DATAGRID_DATA
Struct N_GUI_DROPMENU_DATA
Struct N_GUI_DROPMENU_ENTRY
Struct N_GUI_GRID_CALLBACKS
Struct N_GUI_HEXVIEW_DATA
Struct N_GUI_IMAGE_DATA
Struct N_GUI_KVTABLE
Struct N_GUI_KV_CONTENT
Struct N_GUI_KV_ROW
Struct N_GUI_LABEL_DATA
Struct N_GUI_LISTBOX_DATA
Struct N_GUI_LISTITEM
Struct N_GUI_MARKDOWNVIEW_DATA
Struct N_GUI_MD_FONTS
Struct N_GUI_MD_STYLE
Struct N_GUI_MEAS_ENTRY
Struct N_GUI_MOUSE_EVENT
Struct N_GUI_PENDING_GEOM
Struct N_GUI_PENDING_WIDGET
Struct N_GUI_POPUP
Struct N_GUI_PROGRESSBAR_DATA
Struct N_GUI_RADIOLIST_DATA
Struct N_GUI_SB_TRACK
Struct N_GUI_SCROLLBAR_DATA
Struct N_GUI_SECTION
Struct N_GUI_SECTIONLIST
Struct N_GUI_SLIDER_DATA
Struct N_GUI_SPLITPANE_DATA
Struct N_GUI_STYLE
Struct N_GUI_SUGGEST_SINK
Struct N_GUI_SYNTAXVIEW_DATA
Struct N_GUI_TAB_PANEL
Struct N_GUI_TB_BUTTONS
Struct N_GUI_TEXTAREA_DATA
Struct N_GUI_TEXT_DIMS
Struct N_GUI_THEME
Struct N_GUI_TREE
Struct N_GUI_TREE_NODE
Struct N_GUI_TREE_STATE
Struct N_GUI_WIDGET
Struct N_GUI_WINDOW
Struct N_H2_FRAME
Struct N_H2_HEADER
Struct N_H2_HPACK
Struct N_H2_REQUEST
Struct N_H2_SERVER
Struct N_H2_SETTING
Struct N_HTML_ATTR_
Struct N_HTML_FORM
Struct N_HTML_TAG_
Struct N_HTTP3_RESPONSE
Struct N_HTTP_FIELD
Struct N_HTTP_FORM
Struct N_HTTP_FORM_MULTIPART
Struct N_HTTP_FORM_PART
Struct N_HTTP_MULTIPART_PART
Struct N_HTTP_REQUEST
Struct N_HTTP_RESP
Struct N_HTTP_RESPONSE
Struct N_HTTP_SERVER
Struct N_HTTP_SERVER_CONFIG
Struct N_HTTP_SERVER_REQUEST
Struct N_HTTP_SERVER_STATS
Struct N_HTTP_SET_COOKIE
Struct N_HTTP_STREAM
Struct N_ISO_CAMERA
Struct N_ISO_OBJECT
Struct N_KAFKA
Struct N_KAFKA_EVENT
Struct N_MOCK_SERVER
Struct N_MODULE
Struct N_PARALLEL_SLICE
Struct N_PARALLEL_TEAM
Struct N_PARALLEL_WORKER
Struct N_PCRE
Struct N_PROXY_CFG
Struct N_PTH
Struct N_PTH_TENSOR
Struct N_QUERY
Struct N_ROUTE
Struct N_ROUTER
Struct N_ROUTE_MATCH
Struct N_SHA256
Struct N_SOCKET
Struct N_SPAWN_PIPE
Struct N_SSE_CONN
Struct N_SSE_EVENT
Struct N_STR
Struct N_TIFF
Struct N_TIFF_ENTRY
Struct N_TIME
Struct N_URL
Struct N_URL_PARAM
Struct N_USER
Struct N_USERLIST
Struct N_WS_CONN
Struct N_WS_FRAME
Struct N_WS_MESSAGE
Struct N_ZIP_MEMBER
Struct OCTREE
Struct OCTREE_NODE
Struct PARSER
Struct PARTICLE
Struct PARTICLE_EMITTER
Struct PARTICLE_SYSTEM
Struct PEER
Struct PHYSICS
Struct PK_OBJ
Struct PK_VM
Struct POINT2D
Struct POINT3D
Struct PRETTY_OUT
Struct QNODE
Struct QUADTREE
Struct QUADTREE_NODE
Struct REC
Struct RGB
Struct SAMPLE
Struct SEEN
Struct SHARER
Struct SRV
Struct SRV_ARG
Struct STACK
Struct STACK_ITEM
Struct SYNTAX_RUN
Struct THREAD_POOL
Struct THREAD_POOL_NODE
Struct THREAD_WAITING_PROC
Struct TRAJECTORY
Struct TRAJECTORY_POINT
Struct TREE
Struct TREE_NODE
Struct TS_LOG
Struct WAYPOINT3D
Struct WORKER_ARG
Struct ZIP_SINK
Struct _N_DC_ENTRY
Struct _N_DC_GROUP_ENTRY
Struct _N_GUI_COLORWHEEL
Struct _N_GUI_COLORWHEEL_BLOCK
Struct _N_GUI_COLORWHEEL_MOUSE
Struct _N_GUI_CURVE
Struct _N_GUI_CURVE_BLOCK
Struct _N_GUI_CURVE_MOUSE
Struct _N_GUI_GRID
Struct _N_GUI_POPUP_ENTRY
Struct _N_GUI_POPUP_LEVEL
Struct _N_GUI_SB_SKIN
Struct _N_GUI_TA_STEP
Struct _N_GUI_THUMB
Struct _N_GUI_WRAP_ACC
Struct _compiled
Struct _conn
Struct _ip_slot
Struct _mp_param
Struct _n_civil
Struct _seg
Struct client
Struct collector
Struct date_vector
Struct md_atom
Struct md_cells
Struct md_hit
Struct md_line_ctx
Struct mline
Struct n_http_req_header
Struct n_http_req_limits
Struct n_http_request
Struct n_markdown_block
Struct n_markdown_doc
Struct n_markdown_inline
Struct n_markdown_span
Struct n_reactor_stats
Struct n_url_safe
Struct n_url_safe_head
Struct n_wrap_item
Struct producer_state
Struct rects
Struct reply
Struct runner
Struct sink
Struct tbuf
Struct wrap_hit
Struct wrap_span
Structures
Union COORD_VALUE
Union HASH_DATA
Union NODE_DATA_TYPES
Union STACK_DATA
dir_310dcdd4703e877a6b99d5dc3fc54d27
dir_68267d1309a1af8e8297ef4c3efbcdba
dir_d28a4824dc47e487b107a5db32ef43c4
dir_d44c64559bbebec7f509842c48db8b23
ex__accept__pool__client_8c
ex__accept__pool__server_8c
ex__allegro__4_8c
ex__atlas_8c
ex__avro_8c
ex__base64_8c
ex__bind__exclusive_8c
ex__clipboard_8c
ex__clock__sync_8c
ex__common_8c
ex__configfile_8c
ex__cookies_8c
ex__crypto_8c
ex__diff_8c
ex__digest_8c
ex__disk__cache_8c
ex__dns_8c
ex__ecc_8c
ex__entropy_8c
ex__exceptions_8c
ex__file_8c
ex__file__copy_8c
ex__fluid_8c
ex__fluid__config_8c
ex__fluid__config_8h
ex__git_8c
ex__gui_8c
ex__gui__bench_8c
ex__gui__button__keys_8c
ex__gui__checkbox__label_8c
ex__gui__checkbox__release_8c
ex__gui__color__picker_8c
ex__gui__colorwheel_8c
ex__gui__combobox__items_8c
ex__gui__combobox__wheel_8c
ex__gui__cursor_8c
ex__gui__curve_8c
ex__gui__custom_8c
ex__gui__custom__mouse_8c
ex__gui__datagrid_8c
ex__gui__datagrid__keys_8c
ex__gui__datagrid__sort_8c
ex__gui__detach_8c
ex__gui__dictionary_8c
ex__gui__display__fallback_8c
ex__gui__double__click_8c
ex__gui__dropmenu_8c
ex__gui__frameless__drag_8c
ex__gui__global__scroll_8c
ex__gui__glyph_8c
ex__gui__grid_8c
ex__gui__hexview_8c
ex__gui__hover_8c
ex__gui__isometric_8c
ex__gui__kvtable_8c
ex__gui__label__fits_8c
ex__gui__label__lines_8c
ex__gui__layout__persist_8c
ex__gui__listbox_8c
ex__gui__md_8c
ex__gui__multiwin_8c
ex__gui__network_8c
ex__gui__particles_8c
ex__gui__placeholder_8c
ex__gui__popup_8c
ex__gui__progressbar_8c
ex__gui__reentrant_8c
ex__gui__round_8c
ex__gui__sectionlist_8c
ex__gui__slider__default_8c
ex__gui__slider__handle_8c
ex__gui__slider__step_8c
ex__gui__splitpane_8c
ex__gui__suggest_8c
ex__gui__syntaxview_8c
ex__gui__text__shorten_8c
ex__gui__textarea__selection_8c
ex__gui__tooltip_8c
ex__gui__tree__lazy_8c
ex__gui__tree__order_8c
ex__gui__tree__state_8c
ex__gui__window__rect_8c
ex__gui__zorder_8c
ex__hash_8c
ex__hex_8c
ex__html_8c
ex__http2_8c
ex__http2__server_8c
ex__http3_8c
ex__http__cookie_8c
ex__http__form_8c
ex__http__mime_8c
ex__http__req_8c
ex__http__response_8c
ex__http__router_8c
ex__http__server_8c
ex__icc_8c
ex__iso__astar_8c
ex__json_8c
ex__kafka_8c
ex__linalg_8c
ex__list_8c
ex__log_8c
ex__markdown_8c
ex__module_8c
ex__monolith_8c
ex__network_8c
ex__network_8h
ex__network__accept_8c
ex__network__alpn_8c
ex__network__connect__abort_8c
ex__network__mock_8c
ex__network__proxy_8c
ex__network__reactor_8c
ex__network__sni_8c
ex__network__sse_8c
ex__network__ssl_8c
ex__network__ssl__hardened_8c
ex__network__ssl__hostname_8c
ex__network__ssl__nonblock_8c
ex__network__tls__defaults_8c
ex__network__ws_8c
ex__network__ws__limits_8c
ex__nstr_8c
ex__parallel__for_8c
ex__parallel__team_8c
ex__pcre_8c
ex__pretty_8c
ex__pth_8c
ex__query_8c
ex__random_8c
ex__sha256_8c
ex__signals_8c
ex__spawn_8c
ex__ssrf_8c
ex__stack_8c
ex__thread__pool__discard_8c
ex__thread__pool__wait_8c
ex__threads_8c
ex__tiff_8c
ex__time__formats_8c
ex__trajectory_8c
ex__trees_8c
ex__url_8c
ex__url__safe_8c
ex__wrap_8c
ex__x509_8c
ex__zip_8c
ex__zlib_8c
ex_accept_pool_client_8c example
ex_accept_pool_server_8c example
ex_allegro_4_8c example
ex_atlas_8c example
ex_base64_8c example
ex_clock_sync_8c example
ex_common_8c example
ex_configfile_8c example
ex_cookies_8c example
ex_crypto_8c example
ex_diff_8c example
ex_digest_8c example
ex_disk_cache_8c example
ex_dns_8c example
ex_ecc_8c example
ex_entropy_8c example
ex_exceptions_8c example
ex_file_8c example
ex_file_copy_8c example
ex_fluid_8c example
ex_fluid_config_8c example
ex_fluid_config_8h example
ex_git_8c example
ex_gui_8c example
ex_gui_bench_8c example
ex_gui_button_keys_8c example
ex_gui_checkbox_label_8c example
ex_gui_checkbox_release_8c example
ex_gui_color_picker_8c example
ex_gui_colorwheel_8c example
ex_gui_combobox_items_8c example
ex_gui_combobox_wheel_8c example
ex_gui_cursor_8c example
ex_gui_curve_8c example
ex_gui_custom_8c example
ex_gui_custom_mouse_8c example
ex_gui_datagrid_8c example
ex_gui_datagrid_keys_8c example
ex_gui_datagrid_sort_8c example
ex_gui_detach_8c example
ex_gui_dictionary_8c example
ex_gui_display_fallback_8c example
ex_gui_double_click_8c example
ex_gui_dropmenu_8c example
ex_gui_frameless_drag_8c example
ex_gui_global_scroll_8c example
ex_gui_glyph_8c example
ex_gui_grid_8c example
ex_gui_hexview_8c example
ex_gui_hover_8c example
ex_gui_isometric_8c example
ex_gui_kvtable_8c example
ex_gui_label_fits_8c example
ex_gui_label_lines_8c example
ex_gui_layout_persist_8c example
ex_gui_listbox_8c example
ex_gui_md_8c example
ex_gui_multiwin_8c example
ex_gui_network_8c example
ex_gui_particles_8c example
ex_gui_placeholder_8c example
ex_gui_popup_8c example
ex_gui_progressbar_8c example
ex_gui_reentrant_8c example
ex_gui_round_8c example
ex_gui_sectionlist_8c example
ex_gui_slider_default_8c example
ex_gui_slider_handle_8c example
ex_gui_slider_step_8c example
ex_gui_splitpane_8c example
ex_gui_suggest_8c example
ex_gui_syntaxview_8c example
ex_gui_text_shorten_8c example
ex_gui_textarea_selection_8c example
ex_gui_tooltip_8c example
ex_gui_tree_lazy_8c example
ex_gui_tree_order_8c example
ex_gui_tree_state_8c example
ex_gui_window_rect_8c example
ex_gui_zorder_8c example
ex_hash_8c example
ex_hex_8c example
ex_html_8c example
ex_http2_8c example
ex_http2_server_8c example
ex_http_cookie_8c example
ex_http_form_8c example
ex_http_mime_8c example
ex_http_req_8c example
ex_http_response_8c example
ex_http_router_8c example
ex_http_server_8c example
ex_icc_8c example
ex_iso_astar_8c example
ex_json_8c example
ex_kafka_8c example
ex_linalg_8c example
ex_list_8c example
ex_log_8c example
ex_markdown_8c example
ex_module_8c example
ex_monolith_8c example
ex_network_8c example
ex_network_8h example
ex_network_accept_8c example
ex_network_alpn_8c example
ex_network_connect_abort_8c example
ex_network_mock_8c example
ex_network_proxy_8c example
ex_network_reactor_8c example
ex_network_sni_8c example
ex_network_sse_8c example
ex_network_ssl_8c example
ex_network_ssl_hardened_8c example
ex_network_ssl_hostname_8c example
ex_network_ssl_nonblock_8c example
ex_network_tls_defaults_8c example
ex_network_ws_8c example
ex_network_ws_limits_8c example
ex_nstr_8c example
ex_parallel_for_8c example
ex_parallel_team_8c example
ex_pcre_8c example
ex_pretty_8c example
ex_pth_8c example
ex_query_8c example
ex_random_8c example
ex_sha256_8c example
ex_signals_8c example
ex_spawn_8c example
ex_ssrf_8c example
ex_stack_8c example
ex_threads_8c example
ex_tiff_8c example
ex_time_formats_8c example
ex_trajectory_8c example
ex_trees_8c example
ex_url_8c example
ex_url_safe_8c example
ex_wrap_8c example
ex_x509_8c example
ex_zip_8c example
ex_zlib_8c example
mainpage_8dox
n__3d_8c
n__3d_8h
n__aabb_8c
n__aabb_8h
n__allegro5_8c
n__allegro5_8h
n__allegro__4_8c
n__allegro__4_8h
n__anim_8c
n__anim_8h
n__astar_8c
n__astar_8h
n__atlas_8c
n__atlas_8h
n__avro_8c
n__avro_8h
n__base64_8c
n__base64_8h
n__clipboard_8c
n__clipboard_8h
n__clock__sync_8c
n__clock__sync_8h
n__common_8c
n__common_8h
n__config__file_8c
n__config__file_8h
n__cookies_8c
n__cookies_8h
n__crypto_8c
n__crypto_8h
n__dead__reckoning_8c
n__dead__reckoning_8h
n__diff_8c
n__diff_8h
n__digest_8c
n__digest_8h
n__disk__cache_8c
n__disk__cache_8h
n__dns_8c
n__dns_8h
n__ecc_8c
n__ecc_8h
n__entropy_8c
n__entropy_8h
n__enum_8h
n__exceptions_8c
n__exceptions_8h
n__files_8c
n__files_8h
n__fluids_8c
n__fluids_8h
n__games_8c
n__games_8h
n__git_8c
n__git_8h
n__gui_8c
n__gui_8h
n__gui__color_8c
n__gui__color_8h
n__gui__colorwheel_8c
n__gui__colorwheel_8h
n__gui__curve_8c
n__gui__curve_8h
n__gui__grid_8c
n__gui__grid_8h
n__gui__md_8c
n__gui__md_8h
n__gui__popup_8c
n__gui__popup_8h
n__hash_8c
n__hash_8h
n__hex_8c
n__hex_8h
n__html_8c
n__html_8h
n__http2_8c
n__http2_8h
n__http2__server_8c
n__http2__server_8h
n__http3_8c
n__http3_8h
n__http__cookie_8c
n__http__cookie_8h
n__http__form_8c
n__http__form_8h
n__http__mime_8c
n__http__mime_8h
n__http__req_8c
n__http__req_8h
n__http__response_8c
n__http__response_8h
n__http__router_8c
n__http__router_8h
n__http__server_8c
n__http__server_8h
n__icc_8c
n__icc_8h
n__iso__engine_8c
n__iso__engine_8h
n__json_8c
n__json_8h
n__kafka_8c
n__kafka_8h
n__linalg_8c
n__linalg_8h
n__list_8c
n__list_8h
n__log_8c
n__log_8h
n__lz4_8c
n__lz4_8h
n__markdown_8c
n__markdown_8h
n__module_8c
n__module_8h
n__network_8c
n__network_8h
n__network__accept__pool_8c
n__network__accept__pool_8h
n__network__msg_8c
n__network__msg_8h
n__nodup__log_8c
n__nodup__log_8h
n__openssl__compat_8h
n__particles_8c
n__particles_8h
n__pcre_8c
n__pcre_8h
n__pretty_8c
n__pretty_8h
n__pth_8c
n__pth_8h
n__query_8c
n__query_8h
n__random_8c
n__random_8h
n__reactor_8c
n__reactor_8h
n__sha256_8c
n__sha256_8h
n__signals_8c
n__signals_8h
n__ssrf_8c
n__ssrf_8h
n__stack_8c
n__stack_8h
n__str_8c
n__str_8h
n__thread__pool_8c
n__thread__pool_8h
n__tiff_8c
n__tiff_8h
n__time_8c
n__time_8h
n__trajectory_8c
n__trajectory_8h
n__trees_8c
n__trees_8h
n__url__safe_8c
n__url__safe_8h
n__user_8c
n__user_8h
n__windows_8h
n__wrap_8c
n__wrap_8h
n__x509_8c
n__x509_8h
n__zip_8c
n__zip_8h
n__zlib_8c
n__zlib_8h
nilorea_8h
No results
7
n__network__msg_8c
gullradriel edited this page 2026-10-29 20:54:40 +01:00
src/n_network_msg.c
Network messages function. More...
Attributes
| Name | |
|---|---|
| long long | g_netw_msg_deleted |
| long long | g_netw_msg_created |
| long long | g_netw_bytes_sent Add a message to send in aimed NETWORK. |
| long long | g_netw_bytes_recv |
Detailed Description
Network messages function.
Author: Castagnier Mickael
Version: 1.0
Date: 10/05/2005
Attributes Documentation
variable g_netw_msg_deleted
static long long g_netw_msg_deleted = 0;
variable g_netw_msg_created
static long long g_netw_msg_created = 0;
variable g_netw_bytes_sent
long long g_netw_bytes_sent;
Add a message to send in aimed NETWORK.
Parameters:
- netw NETWORK where add the message
- msg the message to add
Return: TRUE if success FALSE on error
variable g_netw_bytes_recv
long long g_netw_bytes_recv;
Source code
/*
* Nilorea Library
* Copyright (C) 2005-2026 Castagnier Mickael
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "nilorea/n_common.h"
#include "nilorea/n_log.h"
#include "nilorea/n_network.h"
#include "nilorea/n_network_msg.h"
/* Lifecycle counters. Exposed via netw_msg_stats_get(). Messages are
* created and deleted from any thread, so the counters are only touched
* with relaxed atomic operations: advisory telemetry, not a correctness
* signal. */
static long long g_netw_msg_created = 0;
static long long g_netw_msg_deleted = 0;
void netw_msg_stats_get(long long* created, long long* deleted) {
if (created) *created = __atomic_load_n(&g_netw_msg_created, __ATOMIC_RELAXED);
if (deleted) *deleted = __atomic_load_n(&g_netw_msg_deleted, __ATOMIC_RELAXED);
}
/* Process-wide byte counters for the two netw_*_msg pump points
* (accumulated in n_network.c with relaxed atomic adds). Exposed from the
* same header, read here with relaxed atomic loads. */
extern long long g_netw_bytes_sent; /* defined in n_network.c */
extern long long g_netw_bytes_recv; /* defined in n_network.c */
void netw_bytes_stats_get(long long* sent, long long* recv) {
if (sent) *sent = __atomic_load_n(&g_netw_bytes_sent, __ATOMIC_RELAXED);
if (recv) *recv = __atomic_load_n(&g_netw_bytes_recv, __ATOMIC_RELAXED);
}
double double_swap(double value) {
double swaped = 0;
const unsigned char* src = (const unsigned char*)&value;
unsigned char* dst = (unsigned char*)&swaped;
/* swap bytes */
dst[0] = src[7];
dst[1] = src[6];
dst[2] = src[5];
dst[3] = src[4];
dst[4] = src[3];
dst[5] = src[2];
dst[6] = src[1];
dst[7] = src[0];
return swaped;
} /* double_swap() */
double htond(double value) {
/* if byte order is little like x86, PC, ... we swap to network notation */
#if (BYTEORDER_ENDIAN == BYTEORDER_LITTLE_ENDIAN)
double ret = double_swap(value);
#else
double ret = value;
#endif
return ret;
} /* htond() */
double ntohd(double value) {
/* if byte order is little like x86, PC, ... we swap to network notation */
#if (BYTEORDER_ENDIAN == BYTEORDER_LITTLE_ENDIAN)
double ret = double_swap(value);
#else
double ret = value;
#endif
return ret;
} /* ntohd() */
int create_msg(NETW_MSG** msg) {
if ((*msg)) {
n_log(LOG_ERR, "create_msg destination is valid and should be NULL !");
return FALSE;
}
Malloc((*msg), NETW_MSG, 1);
__n_assert(msg && (*msg), return FALSE);
(*msg)->tabstr = new_generic_list(MAX_LIST_ITEMS);
__n_assert((*msg)->tabstr, Free((*msg)); return FALSE);
(*msg)->tabint = new_generic_list(MAX_LIST_ITEMS);
__n_assert((*msg)->tabint, list_destroy(&(*msg)->tabstr); Free((*msg)); return FALSE);
(*msg)->tabflt = new_generic_list(MAX_LIST_ITEMS);
__n_assert((*msg)->tabflt, list_destroy(&(*msg)->tabstr); list_destroy(&(*msg)->tabint); Free((*msg)); return FALSE);
__atomic_fetch_add(&g_netw_msg_created, 1, __ATOMIC_RELAXED);
return TRUE;
} /* create_msg( ... ) */
int delete_msg(NETW_MSG** msg) {
__n_assert(msg, return FALSE);
if ((*msg)) {
if ((*msg)->tabint) {
list_destroy(&(*msg)->tabint);
}
if ((*msg)->tabflt) {
list_destroy(&(*msg)->tabflt);
}
if ((*msg)->tabstr) {
list_destroy(&(*msg)->tabstr);
}
Free((*msg));
__atomic_fetch_add(&g_netw_msg_deleted, 1, __ATOMIC_RELAXED);
} else {
n_log(LOG_ERR, "(*msg) already NULL");
return FALSE;
}
return TRUE;
} /* delete_msg */
int empty_msg(NETW_MSG** msg) {
__n_assert(msg && (*msg), return FALSE);
list_empty((*msg)->tabint);
list_empty((*msg)->tabflt);
list_empty((*msg)->tabstr);
return TRUE;
} /* empty_msg(...) */
int add_nb_to_msg(NETW_MSG* msg, double value) {
double* new_val = NULL;
__n_assert(msg, return FALSE);
Malloc(new_val, double, 1);
__n_assert(new_val, return FALSE);
new_val[0] = value;
if (list_push(msg->tabflt, new_val, free) == FALSE) {
Free(new_val);
return FALSE;
}
return TRUE;
} /* add_nb_to_msg( ... ) */
int add_int_to_msg(NETW_MSG* msg, int value) {
int* new_val = NULL;
__n_assert(msg, return FALSE);
Malloc(new_val, int, 1);
__n_assert(new_val, return FALSE);
new_val[0] = value;
if (list_push(msg->tabint, new_val, free) == FALSE) {
Free(new_val);
return FALSE;
}
return TRUE;
} /* add_int_to_msg( ... ) */
int add_nstrptr_to_msg(NETW_MSG* msg, N_STR* str) {
__n_assert(msg, return FALSE);
__n_assert(str, return FALSE);
__n_assert(str->data, return FALSE);
return list_push(msg->tabstr, str, free_nstr_ptr);
} /* add_nstrptr_to_msg(...) */
int add_nstrdup_to_msg(NETW_MSG* msg, N_STR* str) {
__n_assert(msg, return FALSE);
__n_assert(str, return FALSE);
__n_assert(str->data, return FALSE);
N_STR* dup = nstrdup(str);
__n_assert(dup, return FALSE);
return list_push(msg->tabstr, dup, free_nstr_ptr);
} /* add_nstrdup_to_msg(...) */
int add_strdup_to_msg(NETW_MSG* msg, const char* str) {
__n_assert(msg, return FALSE);
__n_assert(str, return FALSE);
N_STR* dup = char_to_nstr(str);
__n_assert(dup, return FALSE);
return list_push(msg->tabstr, dup, free_nstr_ptr);
} /* add_strdup_to_msg(...) */
int add_bytes_to_msg(NETW_MSG* msg, const void* bytes, size_t len) {
__n_assert(msg, return FALSE);
__n_assert(bytes, return FALSE);
/* new_nstr(N) sets length=N and allocates N+1 bytes. The wire decoder
* requires written < length (length reserves room for a trailing NUL),
* so we ask for len+1 to keep the invariant when written == len. */
N_STR* blob = new_nstr(len + 1);
__n_assert(blob, return FALSE);
if (len > 0) memcpy(blob->data, bytes, len);
blob->data[len] = '\0';
blob->written = len;
if (list_push(msg->tabstr, blob, free_nstr_ptr) == FALSE) {
free_nstr(&blob);
return FALSE;
}
return TRUE;
} /* add_bytes_to_msg(...) */
int get_nb_from_msg(NETW_MSG* msg, double* value) {
double* val = NULL;
__n_assert(msg, return FALSE);
val = list_shift(msg->tabflt, double);
if (val) {
(*value) = val[0];
Free(val);
return TRUE;
}
return FALSE;
} /* get_nb_from_msg(...) */
int get_int_from_msg(NETW_MSG* msg, int* value) {
int* val = NULL;
__n_assert(msg, return FALSE);
val = list_shift(msg->tabint, int);
if (val) {
(*value) = val[0];
Free(val);
return TRUE;
}
return FALSE;
} /* get_int_from_msg(...) */
int get_nstr_from_msg(NETW_MSG* msg, N_STR** value) {
N_STR* val = NULL;
__n_assert(msg, return FALSE);
val = list_shift(msg->tabstr, N_STR);
if (val) {
if ((*value)) {
n_log(LOG_ERR, "Previous pointer value %p overriden by pointer %p", (*value), val);
}
(*value) = val;
return TRUE;
}
return FALSE;
} /* get_nstr_from_msg(...) */
int get_str_from_msg(NETW_MSG* msg, char** value) {
N_STR* val = NULL;
__n_assert(msg, return FALSE);
val = list_shift(msg->tabstr, N_STR);
if (val) {
if ((*value)) {
n_log(LOG_ERR, "Previous pointer value %p overriden by pointer %p", (*value), val);
}
(*value) = val->data;
Free(val);
return TRUE;
}
return FALSE;
} /* get_str_from_msg(...) */
int get_bytes_from_msg(NETW_MSG* msg, void** out_bytes, size_t* out_len) {
__n_assert(msg, return FALSE);
__n_assert(out_bytes, return FALSE);
__n_assert(out_len, return FALSE);
N_STR* val = list_shift(msg->tabstr, N_STR);
if (!val) return FALSE;
if (!val->data || val->written == 0) {
FreeNoLog(val->data);
Free(val);
*out_bytes = NULL;
*out_len = 0;
return FALSE;
}
/* Hand the allocation to the caller, reuses the N_STR buffer to
* avoid an extra copy. The caller frees with plain free(). */
*out_bytes = val->data;
*out_len = val->written;
val->data = NULL;
Free(val);
return TRUE;
} /* get_bytes_from_msg(...) */
N_STR* make_str_from_msg(NETW_MSG* msg) {
size_t str_length = 0;
LIST_NODE* node = NULL;
N_STR *strptr = NULL,
*generated_str = NULL;
char* charptr = NULL;
__n_assert(msg, return NULL);
/* the first thing to do is to computer the resulting string size
the first 12 octets are for the number of ints , floats, strings in the message
*/
str_length = 3 * sizeof(int32_t) + (msg->tabint->nb_items * sizeof(int32_t)) + (msg->tabflt->nb_items * sizeof(double));
/* let's count the eventual string blocks */
node = msg->tabstr->start;
while (node) {
strptr = (N_STR*)node->ptr;
str_length += sizeof(int32_t) + sizeof(int32_t) + strptr->written;
node = node->next;
}
/* preparing the new string */
Malloc(generated_str, N_STR, 1);
__n_assert(generated_str, return NULL);
Malloc(generated_str->data, char, str_length + 1);
__n_assert(generated_str->data, Free(generated_str); return NULL);
generated_str->length = str_length + 1;
generated_str->written = str_length;
/* copying header */
charptr = generated_str->data;
/* testing limits */
if (msg->tabint->nb_items >= UINT32_MAX) {
n_log(LOG_ERR, "too much items (>=UINT32_MAX) in int list of message %p", msg);
free_nstr(&generated_str);
return NULL;
}
if (msg->tabflt->nb_items >= UINT32_MAX) {
n_log(LOG_ERR, "too much items (>=UINT32_MAX) in float list of message %p", msg);
free_nstr(&generated_str);
return NULL;
}
if (msg->tabstr->nb_items >= UINT32_MAX) {
n_log(LOG_ERR, "too much items (>=UINT32_MAX) in string list of message %p", msg);
free_nstr(&generated_str);
return NULL;
}
/* byte order */
uint32_t nb_int_items = htonl((uint32_t)msg->tabint->nb_items);
uint32_t nb_float_items = htonl((uint32_t)msg->tabflt->nb_items);
uint32_t nb_str_items = htonl((uint32_t)msg->tabstr->nb_items);
/* number of ints inside the message */
memcpy(charptr, &nb_int_items, sizeof(uint32_t));
charptr += sizeof(uint32_t);
/* number of doubles inside the message */
memcpy(charptr, &nb_float_items, sizeof(uint32_t));
charptr += sizeof(uint32_t);
/* number of string inside the message */
memcpy(charptr, &nb_str_items, sizeof(uint32_t));
charptr += sizeof(uint32_t);
/* if there are numbers, copy all them ! */
node = msg->tabint->start;
while (node) {
uint32_t* nbptr = (uint32_t*)node->ptr;
uint32_t val = htonl(nbptr[0]);
memcpy(charptr, &val, sizeof(uint32_t));
charptr += sizeof(uint32_t);
node = node->next;
}
/* if there are numbers, copy all them ! */
node = msg->tabflt->start;
while (node) {
const double* nbptr = (const double*)node->ptr;
double val = htond(nbptr[0]);
memcpy(charptr, &val, sizeof(double));
charptr += sizeof(double);
node = node->next;
}
/* if there are strings, copy all them ! */
if (msg->tabstr->nb_items > 0) {
node = msg->tabstr->start;
while (node) {
strptr = (N_STR*)node->ptr;
if (strptr->length >= UINT32_MAX) {
n_log(LOG_ERR, "string too long (>=UINT32_MAX) in string list of message %p", msg);
free_nstr(&generated_str);
return NULL;
}
uint32_t var = htonl((uint32_t)strptr->length);
memcpy(charptr, &var, sizeof(uint32_t));
charptr += sizeof(uint32_t);
if (strptr->written >= UINT32_MAX) {
n_log(LOG_ERR, "string too long (>=UINT32_MAX) in string list of message %p", msg);
free_nstr(&generated_str);
return NULL;
}
var = htonl((uint32_t)strptr->written);
memcpy(charptr, &var, sizeof(uint32_t));
charptr += sizeof(uint32_t);
memcpy(charptr, strptr->data, strptr->written);
charptr += strptr->written;
node = node->next;
}
}
return generated_str;
} /* make_str_from_msg(...) */
NETW_MSG* make_msg_from_str(N_STR* str) {
NETW_MSG* generated_msg = NULL;
N_STR* tmpstr = NULL;
char* charptr = NULL;
uint32_t it,
nb_int = 0,
nb_flt = 0,
nb_str = 0;
int32_t tmpnb = 0;
double tmpflt = 0;
__n_assert(str, return NULL);
charptr = str->data;
/* need at least 3 uint32_t for the header */
if (str->written < 3 * sizeof(uint32_t)) {
n_log(LOG_ERR, "message too short: %zu bytes, need at least %zu", str->written, 3 * sizeof(uint32_t));
return NULL;
}
create_msg(&generated_msg);
__n_assert(generated_msg, return NULL);
memcpy(&nb_int, charptr, sizeof(uint32_t));
charptr += sizeof(uint32_t);
nb_int = ntohl(nb_int);
memcpy(&nb_flt, charptr, sizeof(uint32_t));
charptr += sizeof(uint32_t);
nb_flt = ntohl(nb_flt);
memcpy(&nb_str, charptr, sizeof(uint32_t));
charptr += sizeof(uint32_t);
nb_str = ntohl(nb_str);
/* validate that the message is large enough for the claimed int and float counts.
* Use division-based checks to avoid size_t overflow on 32-bit platforms. */
size_t remaining = str->written - 3 * sizeof(uint32_t);
if (nb_int > remaining / sizeof(uint32_t)) {
n_log(LOG_ERR, "message claims %u ints but only %zu bytes remain", nb_int, remaining);
delete_msg(&generated_msg);
return NULL;
}
remaining -= (size_t)nb_int * sizeof(uint32_t);
if (nb_flt > remaining / sizeof(double)) {
n_log(LOG_ERR, "message claims %u floats but only %zu bytes remain", nb_flt, remaining);
delete_msg(&generated_msg);
return NULL;
}
remaining -= (size_t)nb_flt * sizeof(double);
if (nb_int > 0) {
for (it = 0; it < nb_int; it++) {
memcpy(&tmpnb, charptr, sizeof(uint32_t));
tmpnb = (int32_t)ntohl((uint32_t)tmpnb);
charptr += sizeof(uint32_t);
if (add_int_to_msg(generated_msg, tmpnb) == FALSE) {
n_log(LOG_ERR, "failed to add int %u/%u to message", it, nb_int);
delete_msg(&generated_msg);
return NULL;
}
}
}
if (nb_flt > 0) {
for (it = 0; it < nb_flt; it++) {
memcpy(&tmpflt, charptr, sizeof(double));
tmpflt = ntohd(tmpflt);
charptr += sizeof(double);
if (add_nb_to_msg(generated_msg, tmpflt) == FALSE) {
n_log(LOG_ERR, "failed to add float %u/%u to message", it, nb_flt);
delete_msg(&generated_msg);
return NULL;
}
}
}
if (nb_str > 0) {
/* sanity check: each string needs at least 2 uint32_t for headers */
if ((size_t)nb_str > remaining / (2 * sizeof(uint32_t))) {
n_log(LOG_ERR, "message claims %u strings but only %zu bytes remain (need at least %zu for headers)",
nb_str, remaining, (size_t)nb_str * 2 * sizeof(uint32_t));
delete_msg(&generated_msg);
return NULL;
}
for (it = 0; it < nb_str; it++) {
/* check space for length + written headers */
if (remaining < 2 * sizeof(uint32_t)) {
n_log(LOG_ERR, "string %u/%u: not enough data for string headers (%zu remaining)", it, nb_str, remaining);
delete_msg(&generated_msg);
return NULL;
}
Malloc(tmpstr, N_STR, 1);
__n_assert(tmpstr, { delete_msg(&generated_msg); return NULL; });
uint32_t var = 0;
memcpy(&var, charptr, sizeof(uint32_t));
charptr += sizeof(uint32_t);
tmpstr->length = ntohl(var);
memcpy(&var, charptr, sizeof(uint32_t));
charptr += sizeof(uint32_t);
tmpstr->written = ntohl(var);
remaining -= 2 * sizeof(uint32_t);
/* validate written < length (N_STR requires room for trailing '\0') */
if (tmpstr->length == 0 || tmpstr->written >= tmpstr->length) {
n_log(LOG_ERR, "string %u/%u: written (%zu) >= length (%zu), violates N_STR invariant", it, nb_str, tmpstr->written, tmpstr->length);
Free(tmpstr);
delete_msg(&generated_msg);
return NULL;
}
/* validate remaining buffer has enough for written bytes */
if (tmpstr->written > remaining) {
n_log(LOG_ERR, "string %u/%u: written size %zu exceeds remaining %zu bytes", it, nb_str, tmpstr->written, remaining);
Free(tmpstr);
delete_msg(&generated_msg);
return NULL;
}
/* sanity cap on allocation size to prevent DoS via huge allocation */
if (tmpstr->length > NETW_MSG_MAX_STRING_LENGTH) {
n_log(LOG_ERR, "string %u/%u: length %zu exceeds NETW_MSG_MAX_STRING_LENGTH (%zu)", it, nb_str, tmpstr->length, (size_t)NETW_MSG_MAX_STRING_LENGTH);
Free(tmpstr);
delete_msg(&generated_msg);
return NULL;
}
/* allocate based on written+1 (not untrusted length) to prevent memory-DoS
* where attacker sets length near cap but written tiny */
Malloc(tmpstr->data, char, tmpstr->written + 1);
__n_assert(tmpstr->data, { Free(tmpstr); delete_msg(&generated_msg); return NULL; });
tmpstr->length = tmpstr->written + 1;
memcpy(tmpstr->data, charptr, tmpstr->written);
tmpstr->data[tmpstr->written] = '\0';
charptr += tmpstr->written;
remaining -= tmpstr->written;
if (add_nstrptr_to_msg(generated_msg, tmpstr) == FALSE) {
Free(tmpstr->data);
Free(tmpstr);
delete_msg(&generated_msg);
return NULL;
}
}
}
return generated_msg;
} /* make_msg_from_str(...) */
#ifndef NO_NETMSG_API
N_STR* netmsg_make_ping(int type, int id_from, int id_to, int time) {
NETW_MSG* msg = NULL;
N_STR* tmpstr = NULL;
create_msg(&msg);
__n_assert(msg, return NULL);
if (add_int_to_msg(msg, type) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, id_from) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, id_to) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, time) == FALSE) {
delete_msg(&msg);
return NULL;
}
tmpstr = make_str_from_msg(msg);
delete_msg(&msg);
return tmpstr;
} /* netmsg_make_ping() */
N_STR* netmsg_make_ident(int type, int id, N_STR* name, N_STR* passwd) {
NETW_MSG* msg = NULL;
N_STR* tmpstr = NULL;
create_msg(&msg);
__n_assert(msg, return NULL);
if (add_int_to_msg(msg, type) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, id) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nstrdup_to_msg(msg, name) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nstrdup_to_msg(msg, passwd) == FALSE) {
delete_msg(&msg);
return NULL;
}
tmpstr = make_str_from_msg(msg);
delete_msg(&msg);
return tmpstr;
} /* netmsg_make_ident() */
N_STR* netmsg_make_position_msg(int id, double X, double Y, double vx, double vy, double acc_x, double acc_y, int time_stamp) {
NETW_MSG* msg = NULL;
N_STR* tmpstr = NULL;
create_msg(&msg);
__n_assert(msg, return NULL);
if (add_int_to_msg(msg, NETMSG_POSITION) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, id) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nb_to_msg(msg, X) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nb_to_msg(msg, Y) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nb_to_msg(msg, vx) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nb_to_msg(msg, vy) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nb_to_msg(msg, acc_x) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nb_to_msg(msg, acc_y) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, time_stamp) == FALSE) {
delete_msg(&msg);
return NULL;
}
tmpstr = make_str_from_msg(msg);
delete_msg(&msg);
return tmpstr;
} /* netmsg_make_position_msg() */
N_STR* netmsg_make_string_msg(int id_from, int id_to, N_STR* name, N_STR* chan, N_STR* txt, int color) {
NETW_MSG* msg = NULL;
N_STR* tmpstr = NULL;
create_msg(&msg);
__n_assert(msg, return NULL);
if (add_int_to_msg(msg, NETMSG_STRING) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, id_from) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, id_to) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_int_to_msg(msg, color) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nstrdup_to_msg(msg, name) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nstrdup_to_msg(msg, chan) == FALSE) {
delete_msg(&msg);
return NULL;
}
if (add_nstrdup_to_msg(msg, txt) == FALSE) {
delete_msg(&msg);
return NULL;
}
tmpstr = make_str_from_msg(msg);
delete_msg(&msg);
__n_assert(tmpstr, return NULL);
return tmpstr;
} /* netmsg_make_string_msg */
N_STR* netmsg_make_quit_msg(void) {
NETW_MSG* msg = NULL;
N_STR* tmpstr = NULL;
create_msg(&msg);
__n_assert(msg, return NULL);
if (add_int_to_msg(msg, NETMSG_QUIT) == FALSE) {
delete_msg(&msg);
return NULL;
}
tmpstr = make_str_from_msg(msg);
delete_msg(&msg);
__n_assert(tmpstr, return NULL);
return tmpstr;
} /* netmsg_make_quit_msg() */
int netw_msg_get_type(N_STR* msg) {
uint32_t nb_int = 0;
int32_t tmpnb = 0;
char* charptr = NULL;
__n_assert(msg, return -1);
__n_assert(msg->data, return -1);
/* need at least 3*uint32 header + 1*uint32 for the type int */
if (msg->written < 4 * sizeof(uint32_t)) return -1;
charptr = msg->data;
/* read nb_int from the header to verify the int section is present */
memcpy(&nb_int, charptr, sizeof(uint32_t));
nb_int = ntohl(nb_int);
if (nb_int < 1) {
n_log(LOG_ERR, "netw_msg_get_type: message has no int fields (nb_int=%u), cannot read type", nb_int);
return -1;
}
/* bypass nb_int, nb_flt, nb_str header fields to reach the first int (type) */
charptr += 3 * sizeof(uint32_t);
memcpy(&tmpnb, charptr, sizeof(uint32_t));
tmpnb = (int32_t)ntohl((uint32_t)tmpnb);
return tmpnb;
} /* netw_msg_get_type(...) */
int netw_get_ident(N_STR* msg, int* type, int* ident, N_STR** name, N_STR** passwd) {
NETW_MSG* netmsg = NULL;
__n_assert(msg, return FALSE);
netmsg = make_msg_from_str(msg);
__n_assert(netmsg, return FALSE);
if (get_int_from_msg(netmsg, type) != TRUE ||
get_int_from_msg(netmsg, ident) != TRUE) {
n_log(LOG_ERR, "failed to extract type/ident from ident message");
delete_msg(&netmsg);
return FALSE;
}
if ((*type) != NETMSG_IDENT_REQUEST && (*type) != NETMSG_IDENT_REPLY_OK && (*type) != NETMSG_IDENT_REPLY_NOK) {
n_log(LOG_ERR, "unknow (*type) %d", (*type));
delete_msg(&netmsg);
return FALSE;
}
if (get_nstr_from_msg(netmsg, name) != TRUE ||
get_nstr_from_msg(netmsg, passwd) != TRUE) {
n_log(LOG_ERR, "failed to extract name/passwd from ident message");
free_nstr(name);
free_nstr(passwd);
delete_msg(&netmsg);
return FALSE;
}
delete_msg(&netmsg);
return TRUE;
} /* netw_get_ident( ... ) */
int netw_get_position(N_STR* msg, int* id, double* X, double* Y, double* vx, double* vy, double* acc_x, double* acc_y, int* time_stamp) {
NETW_MSG* netmsg = NULL;
int type = 0;
__n_assert(msg, return FALSE);
netmsg = make_msg_from_str(msg);
__n_assert(netmsg, return FALSE);
if (get_int_from_msg(netmsg, &type) != TRUE) {
n_log(LOG_ERR, "failed to extract type from position message");
delete_msg(&netmsg);
return FALSE;
}
if (type != NETMSG_POSITION) {
delete_msg(&netmsg);
return FALSE;
}
if (get_int_from_msg(netmsg, id) != TRUE ||
get_nb_from_msg(netmsg, X) != TRUE ||
get_nb_from_msg(netmsg, Y) != TRUE ||
get_nb_from_msg(netmsg, vx) != TRUE ||
get_nb_from_msg(netmsg, vy) != TRUE ||
get_nb_from_msg(netmsg, acc_x) != TRUE ||
get_nb_from_msg(netmsg, acc_y) != TRUE ||
get_int_from_msg(netmsg, time_stamp) != TRUE) {
n_log(LOG_ERR, "failed to extract fields from position message");
delete_msg(&netmsg);
return FALSE;
}
delete_msg(&netmsg);
return TRUE;
} /* netw_get_position( ... ) */
int netw_get_string(N_STR* msg, int* id, N_STR** name, N_STR** chan, N_STR** txt, int* color) {
NETW_MSG* netmsg = NULL;
int type = 0;
__n_assert(msg, return FALSE);
netmsg = make_msg_from_str(msg);
__n_assert(netmsg, return FALSE);
if (get_int_from_msg(netmsg, &type) != TRUE) {
n_log(LOG_ERR, "failed to extract type from string message");
delete_msg(&netmsg);
return FALSE;
}
if (type != NETMSG_STRING) {
delete_msg(&netmsg);
return FALSE;
}
int id_to = 0;
if (get_int_from_msg(netmsg, id) != TRUE ||
get_int_from_msg(netmsg, &id_to) != TRUE ||
get_int_from_msg(netmsg, color) != TRUE) {
n_log(LOG_ERR, "failed to extract int fields from string message");
delete_msg(&netmsg);
return FALSE;
}
if (get_nstr_from_msg(netmsg, name) != TRUE ||
get_nstr_from_msg(netmsg, chan) != TRUE ||
get_nstr_from_msg(netmsg, txt) != TRUE) {
n_log(LOG_ERR, "failed to extract string fields from string message");
free_nstr(name);
free_nstr(chan);
free_nstr(txt);
delete_msg(&netmsg);
return FALSE;
}
delete_msg(&netmsg);
return TRUE;
} /* netw_get_string( ... ) */
int netw_get_ping(N_STR* msg, int* type, int* from, int* to, int* time) {
NETW_MSG* netmsg;
__n_assert(msg, return FALSE);
netmsg = make_msg_from_str(msg);
__n_assert(netmsg, return FALSE);
if (get_int_from_msg(netmsg, type) != TRUE) {
n_log(LOG_ERR, "failed to extract type from ping message");
delete_msg(&netmsg);
return FALSE;
}
if ((*type) != NETMSG_PING_REQUEST && (*type) != NETMSG_PING_REPLY) {
delete_msg(&netmsg);
return FALSE;
}
if (get_int_from_msg(netmsg, from) != TRUE ||
get_int_from_msg(netmsg, to) != TRUE ||
get_int_from_msg(netmsg, time) != TRUE) {
n_log(LOG_ERR, "failed to extract fields from ping message");
delete_msg(&netmsg);
return FALSE;
}
delete_msg(&netmsg);
return TRUE;
} /* netw_get_ping( ... ) */
int netw_get_quit(N_STR* msg) {
__n_assert(msg, return FALSE);
NETW_MSG* netmsg = NULL;
netmsg = make_msg_from_str(msg);
__n_assert(netmsg, return FALSE);
int type = -1;
get_int_from_msg(netmsg, &type);
if (type != NETMSG_QUIT) {
delete_msg(&netmsg);
return FALSE;
}
delete_msg(&netmsg);
return TRUE;
} /* netw_get_quit( ... ) */
#endif // NO_NETMSG_API
Modules
- AABB3D
- ACCEPT_POOL
- ALLEGRO4
- ALLEGRO5
- ANIM_LIB
- ASTAR
- ATLAS_LIB
- AVRO
- CLOCK_SYNC
- COMMONS
- CONFIGFILE
- CYPHER_BASE64
- CYPHER_VIGENERE
- DEAD_RECKONING
- ENUMS
- EXCEPTIONS
- GAME_ENV
- GIT
- GUI
- HASH_TABLE
- ISOMETRIC_ENGINE
- LIST
- LOG
- LOGNODUP
- LZ4
- NETWORKING
- NETWORK_MSG
- N_COOKIES
- N_DIFF
- N_DIGEST
- N_DISK_CACHE
- N_DNS
- N_ECC
- N_ENTROPY
- N_FILES
- N_FLUIDS
- N_GUI_COLOR
- N_GUI_COLORWHEEL
- N_GUI_CURVE
- N_GUI_GRID
- N_GUI_POPUP
- N_HEX
- N_HTTP3
- N_HTTP_COOKIE
- N_HTTP_FORM
- N_HTTP_MIME
- N_HTTP_REQ
- N_HTTP_RESP
- N_HTTP_ROUTER
- N_HTTP_SERVER
- N_ICC
- N_JSON
- N_KAFKA
- N_LINALG
- N_MODULE
- N_OPENSSL_COMPAT
- N_PRETTY
- N_PTH
- N_QUERY
- N_RANDOM
- N_SHA256
- N_STR
- N_TIFF
- N_TIME
- N_USER
- N_X509
- N_ZIP
- PARTICLES
- PCRE
- PHYSICS
- SIGNALS
- STACK
- THREADS
- TRAJECTORY
- TREE
- ZLIB