Este repositorio proporciona una abstracción C# administrada de la biblioteca GameNetworkingSockets creada y mantenida por Valve Software. Deberá crear la biblioteca nativa con todas las dependencias necesarias antes de comenzar.
El proyecto se actualiza de acuerdo con las versiones de la biblioteca nativa.
Se puede crear un ensamblado administrado utilizando cualquier plataforma de compilación disponible que admita C# 3.0 o superior.
Defina VALVESOCKETS_SPAN
para habilitar la compatibilidad con Span. Siga estos pasos para permitir un acceso rápido a los bloques de memoria nativos y mejorar el rendimiento.
Antes de comenzar a trabajar, la biblioteca debe inicializarse usando Valve.Sockets.Library.Initialize();
función.
Una vez finalizado el trabajo, desinicialice la biblioteca utilizando Valve.Sockets.Library.Deinitialize();
función.
Servidor NetworkingSockets = new NetworkingSockets();uint pollGroup = server.CreatePollGroup();StatusCallback status = (ref StatusInfo info) => {switch (info.connectionInfo.state) {case ConnectionState.None:break;case ConnectionState.Connecting:server .AcceptConnection(info.conexión);server.SetConnectionPollGroup(pollGroup, info.connection);break;case ConnectionState.Connected:Console.WriteLine("Cliente conectado - ID: " + info.connection + ", IP: " + info.connectionInfo.address.GetIP());break;case ConnectionState. ClosedByPeer:case ConnectionState.ProblemDetectedLocally:server.CloseConnection(info.connection);Console.WriteLine("Cliente desconectado - ID: " + info.connection + ", IP: " + info.connectionInfo.address.GetIP());break;}};utils.SetStatusCallback(status);Dirección dirección = nueva Dirección();address.SetAddress("::0", puerto) ;uint listeningSocket = server.CreateListenSocket(dirección de referencia);#if VALVESOCKETS_SPANMessageCallback mensaje = (en NetworkingMessage netMessage) => {Console.WriteLine("Mensaje recibido de - ID: " + netMessage.connection + ", ID de canal: " + netMessage.channel + ", Longitud de datos: " + netMessage.length);};#else const int maxMessages = 20 ;NetworkingMessage[] netMessages = nuevo NetworkingMessage[maxMessages];#endif while (!Console.KeyAvailable) {servidor.RunCallbacks(); #if VALVESOCKETS_SPANserver.ReceiveMessagesOnPollGroup(pollGroup, mensaje, 20); #else int netMessagesCount = server.ReceiveMessagesOnPollGroup(pollGroup, netMessages, maxMessages);if (netMessagesCount > 0) {for (int i = 0; i < netMessagesCount; i++) {ref NetworkingMessage netMessage = ref netMessages[i];Console.WriteLine("Mensaje recibido de - ID: " + netMessage.connection + ", ID de canal: " + netMessage.channel + ", Longitud de datos: " + netMessage.length);netMessage.Destroy() ;}} #endif Thread.Sleep(15);}server.DestroyPollGroup(pollGroup);
Cliente NetworkingSockets = new NetworkingSockets(); conexión uint = 0; estado StatusCallback = (ref información StatusInfo) => {switch (info.connectionInfo.state) {case ConnectionState.None:break;case ConnectionState.Connected:Console.WriteLine(" Cliente conectado al servidor - ID: " + conexión);interrupción;caso ConnectionState.ClosedByPeer:caso ConnectionState.ProblemDetectedLocally:client.CloseConnection(conexión);Console.WriteLine("Cliente desconectado del servidor");break;}};utils.SetStatusCallback(status);Dirección dirección = nueva Dirección();dirección.SetAddress(":: 1", puerto); conexión = client.Connect (dirección de referencia); #if VALVESOCKETS_SPANMessageCallback mensaje = (en NetworkingMessage netMessage) => {Console.WriteLine("Mensaje recibido del servidor - ID de canal: " + netMessage.channel + ", Longitud de datos: " + netMessage.length);};#else const int maxMessages = 20;NetworkingMessage[] netMessages = nuevo mensaje de red[maxMessages];#endif while (!Console.KeyAvailable) {cliente.RunCallbacks(); #if VALVESOCKETS_SPANclient.ReceiveMessagesOnConnection(conexión, mensaje, 20); #else int netMessagesCount = client.ReceiveMessagesOnConnection(conexión, netMessages, maxMessages);if (netMessagesCount > 0) {for (int i = 0; i < netMessagesCount; i++) {ref NetworkingMessage netMessage = ref netMessages[i];Console.WriteLine ("Mensaje recibido del servidor - ID de canal: " + netMessage.channel + ", Longitud de datos: " + netMessage.length);netMessage.Destroy();}} #endif Thread.Sleep(15);}
byte[] datos = nuevo byte[64];sockets.SendMessageToConnection(conexión, datos);
byte[] buffer = nuevo byte[1024];netMessage.CopyTo(buffer);
DebugCallback debug = (tipo, mensaje) => {Console.WriteLine("Depuración - Tipo: " + tipo + ", Mensaje: " + mensaje);};NetworkingUtils utils = new NetworkingUtils();utils.SetDebugCallback(DebugType.Everything , depurar);
El uso es casi el mismo que en el entorno .NET, excepto que las funciones de la consola deben reemplazarse con funciones proporcionadas por Unity. Si se llamará a NetworkingSockets.RunCallbacks()
en un bucle de juego, mantenga Unity ejecutándose en segundo plano habilitando la opción apropiada en la configuración del reproductor.
Definiciones de indicadores para la función NetworkingSockets.SendMessageToConnection()
:
SendFlags.Unreliable
no confiable, la entrega del mensaje no está garantizada, el mensaje puede entregarse fuera de orden.
SendFlags.Reliable
confiable ordenado, la conexión de destino debe recibir un mensaje y se deben realizar intentos de reenvío hasta que se entregue el mensaje.
SendFlags.NoNagle
un mensaje no se agrupará con otros mensajes dentro de un temporizador.
SendFlags.NoDelay
un mensaje no se almacenará en el búfer si no se puede enviar con relativa rapidez.
Definiciones de tipo de identidad para la estructura NetworkingIdentity
:
IdentityType.Invalid
desconocido o no válido.
IdentityType.SteamID
Identificador de Steam.
IdentityType.IPAddress
Dirección IPv4/IPv6.
Definiciones de estados de conexión para el campo ConnectionInfo.state
:
ConnectionState.None
estado ficticio, la conexión no existe o ya se ha cerrado.
ConnectionState.Connecting
en curso de establecimiento de una conexión iniciada por la función NetworkingSockets.Connect()
.
ConnectionState.FindingRoute
si el servidor acepta la conexión, entonces esta conexión cambia al estado de encuentro, pero la ruta de un extremo a otro aún no se ha establecido (a través de la red de retransmisión).
ConnectionState.Connected
se ha completado una solicitud de conexión iniciada por la función NetworkingSockets.Connect()
.
ConnectionState.ClosedByPeer
el par cerró una conexión, pero no se cerró localmente. Si hay mensajes en la cola entrante, se pueden recuperar. De lo contrario, no se podrá hacer nada con la conexión excepto cerrarla usando la función NetworkingSockets.CloseConnection()
. La conexión todavía existe desde una perspectiva API y debe cerrarse para liberar recursos.
ConnectionState.ProblemDetectedLocally
se ha detectado localmente una interrupción en la conexión. Los intentos de enviar más mensajes fracasarán. Todos los mensajes recibidos restantes en la cola están disponibles. La conexión todavía existe desde una perspectiva API y debe cerrarse para liberar recursos.
Definiciones de alcances de configuración:
ConfigurationScope.Global
ConfigurationScope.SocketsInterface
ConfigurationScope.ListenSocket
ConfigurationScope.Connection
Definiciones de tipos de datos de configuración:
ConfigurationDataType.Int32
ConfigurationDataType.Int64
ConfigurationDataType.Float
ConfigurationDataType.String
ConfigurationDataType.FunctionPtr
Definiciones de valores de configuración:
ConfigurationValue.Invalid
ConfigurationValue.FakePacketLossSend
ConfigurationValue.FakePacketLossRecv
ConfigurationValue.FakePacketLagSend
ConfigurationValue.FakePacketLagRecv
ConfigurationValue.FakePacketReorderSend
ConfigurationValue.FakePacketReorderRecv
ConfigurationValue.FakePacketReorderTime
ConfigurationValue.FakePacketDupSend
ConfigurationValue.FakePacketDupRecv
ConfigurationValue.FakePacketDupTimeMax
ConfigurationValue.TimeoutInitial
ConfigurationValue.TimeoutConnected
ConfigurationValue.SendBufferSize
ConfigurationValue.SendRateMin
ConfigurationValue.SendRateMax
ConfigurationValue.NagleTime
ConfigurationValue.IPAllowWithoutAuth
ConfigurationValue.MTUPacketSize
ConfigurationValue.MTUDataSize
ConfigurationValue.Unencrypted
ConfigurationValue.EnumerateDevVars
ConfigurationValue.SymmetricConnect
ConfigurationValue.LocalVirtualPort
ConfigurationValue.ConnectionStatusChanged
ConfigurationValue.AuthStatusChanged
ConfigurationValue.RelayNetworkStatusChanged
ConfigurationValue.MessagesSessionRequest
ConfigurationValue.MessagesSessionFailed
ConfigurationValue.P2PSTUNServerList
ConfigurationValue.P2PTransportICEEnable
ConfigurationValue.P2PTransportICEPenalty
ConfigurationValue.P2PTransportSDRPenalty
ConfigurationValue.SDRClientConsecutitivePingTimeoutsFailInitial
ConfigurationValue.SDRClientConsecutitivePingTimeoutsFail
ConfigurationValue.SDRClientMinPingsBeforePingAccurate
ConfigurationValue.SDRClientSingleSocket
ConfigurationValue.SDRClientForceRelayCluster
ConfigurationValue.SDRClientDebugTicketAddress
ConfigurationValue.SDRClientForceProxyAddr
ConfigurationValue.SDRClientFakeClusterPing
ConfigurationValue.LogLevelAckRTT
ConfigurationValue.LogLevelPacketDecode
ConfigurationValue.LogLevelMessage
ConfigurationValue.LogLevelPacketGaps
ConfigurationValue.LogLevelP2PRendezvous
ConfigurationValue.LogLevelSDRRelayPings
Definiciones de los resultados del valor de configuración:
ConfigurationValueResult.BadValue
ConfigurationValueResult.BadScopeObject
ConfigurationValueResult.BufferTooSmall
ConfigurationValueResult.OK
ConfigurationValueResult.OKInherited
Definiciones de tipos de depuración:
DebugType.None
DebugType.Bug
DebugType.Error
DebugType.Important
DebugType.Warning
DebugType.Message
DebugType.Verbose
DebugType.Debug
DebugType.Everything
Definiciones de resultado de operación:
Result.OK
éxito.
Result.Fail
error genérico.
Result.NoConnection
falló la conexión de red.
Result.InvalidParam
un parámetro es incorrecto.
Result.InvalidState
el objeto llamado estaba en un estado no válido.
Result.Ignored
El objetivo ignorado está ignorando a un remitente.
Proporciona eventos por socket.
StatusCallback(ref StatusInfo info)
notifica cuando el mecanismo de envío en el socket de escucha devuelve un estado de conexión. Se debe evitar que una referencia al delegado sea recolectada como basura.
Proporciona eventos por aplicación.
DebugCallback(DebugType type, string message)
notifica cuando aparece información de depuración con la detalle deseada. Se debe evitar que una referencia al delegado sea recolectada como basura.
Contiene datos ordenados con una dirección IP y un número de puerto.
Address.ip
Dirección IP en bytes.
Address.port
número de puerto.
Address.IsLocalHost
comprueba si la identidad es localhost.
Address.GetIP()
obtiene una dirección IP en un formato imprimible.
Address.SetLocalHost(ushort port)
establece el host local con un puerto específico.
Address.SetAddress(string ip, ushort port)
establece una dirección IP (IPv4/IPv6) con un puerto específico.
Address.Equals(Address other)
determina la igualdad de direcciones.
Contiene datos ordenados con configuración.
Configuration.value
un tipo del valor descrito en la enumeración ConfigurationValue
.
Configuration.dataType
un tipo de datos descritos en la enumeración ConfigurationDataType
.
Configuration.data
una unión de datos de configuración.
Contiene datos ordenados con el estado de la conexión.
ID de conexión StatusInfo.connection
.
StatusInfo.connectionInfo
esencialmente estructura ConnectionInfo
con datos ordenados.
Contiene datos ordenados con información de conexión.
ConnectionInfo.identity
de identidad de un punto final.
ConnectionInfo.userData
datos proporcionados por el usuario que se configuran mediante la función NetworkingSockets.SetConnectionUserData()
.
ConnectionInfo.listenSocket
toma de escucha para esta conexión.
ConnectionInfo.address
dirección remota de un punto final.
ConnectionInfo.state
Estado de alto nivel de la conexión descrita en la enumeración ConnectionState
.
ConnectionInfo.endReason
causa básica de la terminación o problema de la conexión.
ConnectionInfo.endDebug
explicación en un formato legible por humanos para la terminación o problema de la conexión. Esto está destinado únicamente a fines de diagnóstico de depuración, no para mostrárselo a los usuarios. Es posible que tenga algunos detalles específicos del problema.
La descripción de depuración ConnectionInfo.connectionDescription
incluye el identificador de conexión, el tipo de conexión y la información del par.
Contiene datos ordenados con el estado de la conexión para solicitudes frecuentes.
ConnectionStatus.state
estado de alto nivel de la conexión descrita en la enumeración ConnectionState
.
ConnectionStatus.ping
ping actual en milisegundos.
ConnectionStatus.connectionQualityLocal
de la conexión local medida localmente (porcentaje de paquetes entregados de un extremo a otro en orden).
ConnectionStatus.connectionQualityRemote
de éxito de la entrega remota de paquetes observada desde el host remoto.
ConnectionStatus.outPacketsPerSecond
tasas de paquetes salientes actuales del historial reciente.
ConnectionStatus.outBytesPerSecond
tasas de datos salientes actuales del historial reciente.
ConnectionStatus.inPacketsPerSecond
tasas de paquetes entrantes actuales del historial reciente.
ConnectionStatus.inBytesPerSecond
tasas de datos entrantes actuales del historial reciente.
ConnectionStatus.sendRateBytesPerSecond
tasa estimada a la que se pueden enviar datos a un igual. Podría ser significativamente mayor que ConnectionStatus.outBytesPerSecond
, lo que significa que la capacidad del canal es mayor que los datos enviados.
ConnectionStatus.pendingUnreliable
Número no confiable de bytes pendientes de enviar de manera no confiable. Estos son datos que solicitaron ser enviados recientemente pero que aún no se han transferido.
ConnectionStatus.pendingReliable
de bytes pendientes de enviar de manera confiable. El número confiable también incluye datos que se colocaron previamente en el cable pero que ahora se ha programado para su retransmisión. Por lo tanto, es posible observar un aumento de los bytes entre dos comprobaciones, incluso si no se realizaron llamadas para enviar datos confiables entre las comprobaciones. Los datos que están a la espera del retraso de Nagle aparecerán en estos números.
ConnectionStatus.sentUnackedReliable
de bytes de datos confiables que se han colocado en el cable, pero para los cuales aún no se ha recibido una confirmación y, por lo tanto, es posible que deban retransmitirse.
Contiene datos ordenados de identidad de red.
NetworkingIdentity.type
descripción de una identidad de red.
NetworkingIdentity.IsInvalid
comprueba si la identidad tiene un tipo no válido.
NetworkingIdentity.GetSteamID()
obtiene la ID de Steam.
NetworkingIdentity.SetSteamID(ulong steamID)
establece la ID de Steam.
Contiene datos ordenados del mensaje de red.
NetworkingMessage.identity
de identidad de un remitente.
NetworkingMessage.connectionUserData
datos de conexión proporcionados por el usuario que se configuran mediante la función NetworkingSockets.SetConnectionUserData()
.
NetworkingMessage.timeReceived
la marca de tiempo local cuando se recibió el mensaje.
NetworkingMessage.messageNumber
número de mensaje asignado por un remitente.
Carga útil NetworkingMessage.data
de un mensaje.
NetworkingMessage.length
longitud de la carga útil.
NetworkingMessage.connection
ID de conexión de donde proviene el mensaje.
NetworkingMessage.channel
número de canal en el que se recibió el mensaje.
NetworkingMessage.flags
indicadores que se utilizaron para enviar el mensaje.
NetworkingMessage.CopyTo(byte[] destination)
copia la carga útil del mensaje a la matriz de destino.
NetworkingMessage.Destroy()
destruye el mensaje. Solo debe llamarse cuando los mensajes se obtienen de sockets.
Contiene un puntero administrado a los sockets.
NetworkingSockets.CreateListenSocket(ref Address address, Configuration[] configurations)
crea un socket con configuraciones opcionales y devuelve una ID de socket que escucha las conexiones entrantes iniciadas por la función NetworkingSockets.Connect()
.
NetworkingSockets.Connect(ref Address address, Configuration[] configurations)
inicia una conexión a un host externo con configuraciones opcionales. Devuelve un ID de conexión local.
NetworkingSockets.AcceptConnection(Connection connection)
acepta una conexión entrante que se ha recibido en un socket de escucha. Cuando se recibe un intento de conexión (quizás después de que se hayan intercambiado algunos paquetes de protocolo de enlace básicos para evitar suplantaciones triviales), se crea un objeto de interfaz de conexión en el estado ConnectionState.Connecting
y se llama a StatusCallback()
. Devuelve un resultado descrito en la enumeración Result
.
NetworkingSockets.CloseConnection(Connection connection, int reason, string debug, bool enableLinger)
se desconecta del host e invalida el identificador de conexión. Cualquier dato no leído en la conexión se descarta. El parámetro de motivo es un código opcional proporcionado por el usuario que se recibirá en el otro extremo y se registrará (cuando sea posible) en el análisis de backend. El registro de depuración puede indicar un error si el código de motivo está fuera del rango aceptable. El parámetro de depuración es una cadena de diagnóstico opcional legible por humanos que se recibirá en el otro extremo y se registrará (cuando sea posible) en el análisis de backend. Si el usuario desea poner el socket en un estado persistente, donde se intenta eliminar los datos enviados restantes, el parámetro persistente debe estar habilitado; de lo contrario, no se eliminan los datos confiables. Si la conexión ya finalizó, se ignora el código de motivo, la cadena de depuración y el parámetro persistente. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.CloseListenSocket(ListenSocket socket, string remoteReason)
destruye el socket de escucha y todos los sockets de cliente generados al aceptar conexiones en el socket de escucha. El motivo remoto determina qué acciones de limpieza se realizan en los sockets del cliente que se destruyen. Si se solicita una limpieza y el usuario ha solicitado el socket de escucha vinculado a un puerto local particular para facilitar las conexiones IPv4 directas, entonces el socket UDP subyacente debe permanecer abierto hasta que se hayan limpiado todos los clientes. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.SetConnectionUserData(Connection peer, long userData)
establece datos proporcionados por el usuario para la conexión. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.GetConnectionUserData(Connection peer)
devuelve datos proporcionados por el usuario o -1 si un identificador no es válido o si no se han configurado datos para la conexión.
NetworkingSockets.SetConnectionName(Connection peer, string name)
establece un nombre para la conexión, que se utiliza principalmente para depurar.
NetworkingSockets.GetConnectionName(Connection peer, StringBuilder name, int maxLength)
recupera el nombre de la conexión en la cadena mutable. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.SendMessageToConnection(Connection connection, byte[] data, int length, SendFlags flags)
envía un mensaje al host en el socket conectado. Los parámetros de longitud y tipo de envío son opcionales. Se pueden especificar varias banderas a la vez. Devuelve un resultado descrito en la enumeración Result
. Se puede utilizar el puntero IntPtr
a un búfer nativo en lugar de una referencia a una matriz de bytes.
NetworkingSockets.FlushMessagesOnConnection(Connection connection)
si Nagle está habilitado (está habilitado de forma predeterminada), el mensaje se pondrá en cola durante el tiempo de Nagle antes de enviarse, para fusionar mensajes pequeños en el mismo paquete. Llame a esta función para vaciar los mensajes en cola y enviarlos inmediatamente en la próxima transmisión. Devuelve un resultado descrito en la enumeración Result
.
NetworkingSockets.ReceiveMessagesOnConnection(Connection connection, NetworkingMessage[] messages, int maxMessages)
recupera los siguientes mensajes disponibles del socket para una conexión. Devuelve una cantidad de mensajes o -1 si el identificador de conexión no es válido. El orden de los mensajes devueltos en la matriz es relevante. Los mensajes confiables se recibirán en el orden en que fueron enviados. Si se obtiene algún mensaje, se debe llamar message.Destroy()
para cada uno de ellos para liberar recursos.
NetworkingSockets.GetConnectionInfo(Connection connection, ref ConnectionInfo info)
obtiene información sobre la conexión especificada. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.GetQuickConnectionStatus(Connection connection, ref ConnectionStatus status)
obtiene un breve conjunto de estado de conexión que se puede mostrar al usuario en el juego. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.GetDetailedConnectionStatus(Connection connection, StringBuilder status, int statusLength)
obtiene estadísticas de conexión detalladas en un formato imprimible. Devuelve 0 en caso de éxito, -1 en caso de error o > 0 si la capacidad de la cadena mutable no es suficiente.
NetworkingSockets.GetListenSocketAddress(ListenSocket socket, ref Address address)
obtiene la IP local y el número de puerto de un socket de escucha. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingSockets.CreateSocketPair(Connection connectionLeft, Connection connectionRight, bool useNetworkLoopback, ref NetworkingIdentity identityLeft, ref NetworkingIdentity identityRight)
crea un par de conexiones que se comunican entre sí, por ejemplo, una comunicación en bucle invertido. Las dos conexiones se colocarán inmediatamente en el estado conectado y no se realizarán devoluciones de llamada. Después de esto, si alguna de las conexiones se cierra, la otra conexión recibirá una devolución de llamada, exactamente como si se estuvieran comunicando a través de la red. De forma predeterminada, se utilizan buffers internos, evitando completamente la red, dividiendo los mensajes en paquetes, encriptando, copiando la carga útil, etc. Esto significa que los paquetes loopback, de forma predeterminada, no simularán retrasos o pérdidas. El parámetro de bucle invertido de red habilitado hará que el par de sockets envíe paquetes a través del dispositivo de bucle invertido de la red local en puertos efímeros. En este caso, se admiten pérdidas y retrasos falsos, y se gasta tiempo de CPU para cifrar y descifrar.
NetworkingSockets.GetIdentity()
obtiene una identidad asociada con los sockets.
NetworkingSockets.CreatePollGroup()
crea un nuevo grupo de encuesta para las conexiones. Devuelve el identificador del grupo de encuesta.
NetworkingSockets.DestroyPollGroup(PollGroup pollGroup)
destruye un grupo de encuesta. Si hay conexiones en el grupo de encuesta, se eliminan del grupo y se dejan en un estado en el que no forman parte de ningún grupo de encuesta. Devuelve falso si se pasa un identificador de grupo de encuesta no válido.
NetworkingSockets.SetConnectionPollGroup(PollGroup pollGroup, Connection connection)
asigna una conexión a un grupo de encuesta. Una conexión sólo puede pertenecer a un único grupo de encuesta. Agregar una conexión a un grupo de encuesta la elimina implícitamente de cualquier otro grupo de encuesta. Puede pasar un valor cero al parámetro del grupo de encuesta para eliminar una conexión de su grupo de encuesta actual. Si actualmente hay mensajes recibidos pendientes en la conexión, se intenta agregarlos a la cola de mensajes para el grupo de encuesta aproximadamente en el orden que se habría aplicado si la conexión ya fuera parte del grupo de encuesta en el momento en que se realizó la conexión. Se recibieron mensajes. Devuelve falso si el identificador de conexión no es válido o si el identificador del grupo de encuesta no es válido.
NetworkingSockets.ReceiveMessagesOnPollGroup()
recupera los siguientes mensajes disponibles del socket en cualquier conexión del grupo de encuesta. Examine NetworkingMessage.connection
para identificar la conexión. El orden de entrega de los mensajes entre diferentes conexiones normalmente coincidirá con el orden en que se recibió el último paquete que completó el mensaje. Pero esto no es una garantía sólida, especialmente para los paquetes recibidos justo cuando se asigna una conexión al grupo de encuesta. El orden de entrega de los mensajes en la misma conexión está bien definido y existen las mismas garantías. Los mensajes no están agrupados por conexión, por lo que no necesariamente aparecerán de forma consecutiva en la lista, pudiendo estar intercalados con mensajes de otras conexiones. Devuelve una cantidad de mensajes o -1 si el identificador del grupo de encuesta no es válido.
NetworkingSockets.RunCallbacks()
envía devoluciones de llamada si están disponibles.
NetworkingUtils.Dispose()
destruye las utilidades de red y limpia los recursos no administrados.
NetworkingUtils.Time
devuelve una hora monótona local actual en microsegundos. Nunca se reinicia mientras la aplicación permanece activa.
NetworkingUtils.FirstConfigurationValue
obtiene el valor de configuración numerado más bajo disponible en el entorno actual.
NetworkingUtils.SetStatusCallback(StatusCallback callback)
establece una devolución de llamada para actualizaciones del estado de la conexión. Devuelve verdadero en caso de éxito o falso en caso de error.
NetworkingUtils.SetDebugCallback(DebugType detailLevel, DebugCallback callback)
establece una devolución de llamada para la salida de depuración.
NetworkingUtils.SetConfigurationValue(ConfigurationValue configurationValue, ConfigurationScope configurationScope, IntPtr scopeObject, ConfigurationDataType dataType, IntPtr value)
establece un valor de configuración según las enumeraciones ConfigurationValue
, ConfigurationScope
y ConfigurationDataType
. El parámetro de valor debe ser una referencia al valor real.
NetworkingUtils.SetConfigurationValue(Configuration configuration, ConfigurationScope configurationScope, IntPtr scopeObject)
establece una configuración utilizando la estructura Configuration
de acuerdo con la enumeración ConfigurationScope
.
NetworkingUtils.GetConfigurationValue(ConfigurationValue configurationValue, ConfigurationScope configurationScope, IntPtr scopeObject, ref ConfigurationDataType dataType, ref IntPtr result, ref IntPtr resultLength)
obtiene un valor de configuración según las enumeraciones ConfigurationValue
, ConfigurationScope
y ConfigurationDataType
.
Contiene campos constantes.
Library.maxCloseMessageLength
la longitud máxima de la cadena de motivo en bytes cuando se cierra una conexión.
Library.maxMessageSize
el tamaño máximo de un único mensaje que se puede enviar.
Library.Initialize(ref NetworkingIdentity identity, StringBuilder errorMessage)
inicializa la biblioteca nativa con una identidad opcional que se asociará con los sockets. El parámetro de mensaje de error es opcional y debe usarse para determinar el error durante la inicialización. La capacidad de una cadena mutable para un mensaje de error debe ser igual a Library.maxErrorMessageLength
.
Library.Deinitialize()
desinicializa la biblioteca nativa. Se debe llamar una vez finalizado el trabajo.