Vanara/PInvoke/Ws2_32/WinSock2.legacy.cs

6364 lines
320 KiB
C#
Raw Normal View History

#pragma warning disable IDE1006 // Naming Styles
using System;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using Vanara.Extensions;
using Vanara.InteropServices;
namespace Vanara.PInvoke
{
/// <summary>Functions, structures and constants from ws2_32.h.</summary>
public static partial class Ws2_32
{
/// <summary>A flag that describes what types of operation will no longer be allowed.</summary>
[PInvokeData("winsock.h", MSDNShortId = "6998f0c6-adc9-481f-b9fb-75f9c9f5caaf")]
public enum SD
{
/// <summary>Shutdown receive operations.</summary>
SD_RECEIVE = 0,
/// <summary>Shutdown send operations.</summary>
SD_SEND = 1,
/// <summary>Shutdown both send and receive operations.</summary>
SD_BOTH = 2,
}
/// <summary>The <c>accept</c> function permits an incoming connection attempt on a socket.</summary>
/// <param name="s">
/// A descriptor that identifies a socket that has been placed in a listening state with the listen function. The connection is
/// actually made with the socket that is returned by <c>accept</c>.
/// </param>
/// <param name="addr">
/// An optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The
/// exact format of the addr parameter is determined by the address family that was established when the socket from the sockaddr
/// structure was created.
/// </param>
/// <param name="addrlen">An optional pointer to an integer that contains the length of structure pointed to by the addr parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>accept</c> returns a value of type <c>SOCKET</c> that is a descriptor for the new socket. This returned
/// value is a handle for the socket on which the actual connection is made.
/// </para>
/// <para>Otherwise, a value of <c>INVALID_SOCKET</c> is returned, and a specific error code can be retrieved by calling WSAGetLastError.</para>
/// <para>
/// The integer referred to by addrlen initially contains the amount of space pointed to by addr. On return it will contain the
/// actual length in bytes of the address returned.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>An incoming connection was indicated, but was subsequently terminated by the remote peer prior to accepting the call.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The addrlen parameter is too small or addr is not a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The listen function was not invoked prior to accept.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEMFILE</term>
/// <term>The queue is nonempty upon entry to accept and there are no descriptors available.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>The referenced socket is not a type that supports connection-oriented service.</term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and no connections are present to be accepted.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>accept</c> function extracts the first connection on the queue of pending connections on socket s. It then creates and
/// returns a handle to the new socket. The newly created socket is the socket that will handle the actual connection; it has the
/// same properties as socket s, including the asynchronous events registered with the WSAAsyncSelect or WSAEventSelect functions.
/// </para>
/// <para>
/// The <c>accept</c> function can block the caller until a connection is present if no pending connections are present on the
/// queue, and the socket is marked as blocking. If the socket is marked as nonblocking and no pending connections are present on
/// the queue, <c>accept</c> returns an error as described in the following. After the successful completion of <c>accept</c>
/// returns a new socket handle, the accepted socket cannot be used to accept more connections. The original socket remains open and
/// listens for new connection requests.
/// </para>
/// <para>
/// The parameter addr is a result parameter that is filled in with the address of the connecting entity, as known to the
/// communications layer. The exact format of the addr parameter is determined by the address family in which the communication is
/// occurring. The addrlen is a value-result parameter; it should initially contain the amount of space pointed to by addr; on
/// return it will contain the actual length (in bytes) of the address returned.
/// </para>
/// <para>
/// The <c>accept</c> function is used with connection-oriented socket types such as SOCK_STREAM. If addr and/or addrlen are equal
/// to <c>NULL</c>, then no information about the remote address of the accepted socket is returned.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>accept</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>accept</c> function.</para>
/// <para>For another example that uses the <c>accept</c> function, see Getting Started With Winsock.</para>
/// <para>Notes for ATM</para>
/// <para>
/// The following are important issues associated with connection setup, and must be considered when using Asynchronous Transfer
/// Mode (ATM) with Windows Sockets 2:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// The <c>accept</c> and WSAAccept functions do not necessarily set the remote address and address length parameters. Therefore,
/// when using ATM, the caller should use the <c>WSAAccept</c> function and place ATM_CALLING_PARTY_NUMBER_IE in the
/// <c>ProviderSpecific</c> member of the QoS structure, which itself is included in the lpSQOS parameter of the callback function
/// used in accordance with <c>WSAAccept</c>.
/// </term>
/// </item>
/// <item>
/// <term>
/// When using the <c>accept</c> function, realize that the function may return before connection establishment has traversed the
/// entire distance between sender and receiver. This is because the <c>accept</c> function returns as soon as it receives a CONNECT
/// ACK message; in ATM, a CONNECT ACK message is returned by the next switch in the path as soon as a CONNECT message is processed
/// (rather than the CONNECT ACK being sent by the end node to which the connection is ultimately established). As such,
/// applications should realize that if data is sent immediately following receipt of a CONNECT ACK message, data loss is possible,
/// since the connection may not have been established all the way between sender and receiver.
/// </term>
/// </item>
/// </list>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-accept SOCKET WSAAPI accept( SOCKET s, sockaddr *addr,
// int *addrlen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "72246263-4806-4ab2-9b26-89a1782a954b")]
public static extern SafeSOCKET accept(SOCKET s, SOCKADDR addr, ref int addrlen);
/// <summary>The <c>accept</c> function permits an incoming connection attempt on a socket.</summary>
/// <param name="s">
/// A descriptor that identifies a socket that has been placed in a listening state with the listen function. The connection is
/// actually made with the socket that is returned by <c>accept</c>.
/// </param>
/// <param name="addr">
/// An optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The
/// exact format of the addr parameter is determined by the address family that was established when the socket from the sockaddr
/// structure was created.
/// </param>
/// <param name="addrlen">An optional pointer to an integer that contains the length of structure pointed to by the addr parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>accept</c> returns a value of type <c>SOCKET</c> that is a descriptor for the new socket. This returned
/// value is a handle for the socket on which the actual connection is made.
/// </para>
/// <para>Otherwise, a value of <c>INVALID_SOCKET</c> is returned, and a specific error code can be retrieved by calling WSAGetLastError.</para>
/// <para>
/// The integer referred to by addrlen initially contains the amount of space pointed to by addr. On return it will contain the
/// actual length in bytes of the address returned.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>An incoming connection was indicated, but was subsequently terminated by the remote peer prior to accepting the call.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The addrlen parameter is too small or addr is not a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The listen function was not invoked prior to accept.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEMFILE</term>
/// <term>The queue is nonempty upon entry to accept and there are no descriptors available.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>The referenced socket is not a type that supports connection-oriented service.</term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and no connections are present to be accepted.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>accept</c> function extracts the first connection on the queue of pending connections on socket s. It then creates and
/// returns a handle to the new socket. The newly created socket is the socket that will handle the actual connection; it has the
/// same properties as socket s, including the asynchronous events registered with the WSAAsyncSelect or WSAEventSelect functions.
/// </para>
/// <para>
/// The <c>accept</c> function can block the caller until a connection is present if no pending connections are present on the
/// queue, and the socket is marked as blocking. If the socket is marked as nonblocking and no pending connections are present on
/// the queue, <c>accept</c> returns an error as described in the following. After the successful completion of <c>accept</c>
/// returns a new socket handle, the accepted socket cannot be used to accept more connections. The original socket remains open and
/// listens for new connection requests.
/// </para>
/// <para>
/// The parameter addr is a result parameter that is filled in with the address of the connecting entity, as known to the
/// communications layer. The exact format of the addr parameter is determined by the address family in which the communication is
/// occurring. The addrlen is a value-result parameter; it should initially contain the amount of space pointed to by addr; on
/// return it will contain the actual length (in bytes) of the address returned.
/// </para>
/// <para>
/// The <c>accept</c> function is used with connection-oriented socket types such as SOCK_STREAM. If addr and/or addrlen are equal
/// to <c>NULL</c>, then no information about the remote address of the accepted socket is returned.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>accept</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>accept</c> function.</para>
/// <para>For another example that uses the <c>accept</c> function, see Getting Started With Winsock.</para>
/// <para>Notes for ATM</para>
/// <para>
/// The following are important issues associated with connection setup, and must be considered when using Asynchronous Transfer
/// Mode (ATM) with Windows Sockets 2:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// The <c>accept</c> and WSAAccept functions do not necessarily set the remote address and address length parameters. Therefore,
/// when using ATM, the caller should use the <c>WSAAccept</c> function and place ATM_CALLING_PARTY_NUMBER_IE in the
/// <c>ProviderSpecific</c> member of the QoS structure, which itself is included in the lpSQOS parameter of the callback function
/// used in accordance with <c>WSAAccept</c>.
/// </term>
/// </item>
/// <item>
/// <term>
/// When using the <c>accept</c> function, realize that the function may return before connection establishment has traversed the
/// entire distance between sender and receiver. This is because the <c>accept</c> function returns as soon as it receives a CONNECT
/// ACK message; in ATM, a CONNECT ACK message is returned by the next switch in the path as soon as a CONNECT message is processed
/// (rather than the CONNECT ACK being sent by the end node to which the connection is ultimately established). As such,
/// applications should realize that if data is sent immediately following receipt of a CONNECT ACK message, data loss is possible,
/// since the connection may not have been established all the way between sender and receiver.
/// </term>
/// </item>
/// </list>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-accept SOCKET WSAAPI accept( SOCKET s, sockaddr *addr,
// int *addrlen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "72246263-4806-4ab2-9b26-89a1782a954b")]
public static extern SafeSOCKET accept(SOCKET s, [Optional] IntPtr addr, [Optional] IntPtr addrlen);
/// <summary>The <c>bind</c> function associates a local address with a socket.</summary>
/// <param name="s">A descriptor identifying an unbound socket.</param>
/// <param name="addr">TBD</param>
/// <param name="namelen">The length, in bytes, of the value pointed to by the name parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>bind</c> returns zero. Otherwise, it returns SOCKET_ERROR, and a specific error code can be retrieved by
/// calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term></term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEACCES</term>
/// <term>
/// An attempt was made to access a socket in a way forbidden by its access permissions. This error is returned if nn attempt to
/// bind a datagram socket to the broadcast address failed because the setsockopt option SO_BROADCAST is not enabled.
/// </term>
/// </item>
/// <item>
/// <term>WSAEADDRINUSE</term>
/// <term>
/// Only one usage of each socket address (protocol/network address/port) is normally permitted. This error is returned if a process
/// on the computer is already bound to the same fully qualified address and the socket has not been marked to allow address reuse
/// with SO_REUSEADDR. For example, the IP address and port specified in the name parameter are already bound to another socket
/// being used by another application. For more information, see the SO_REUSEADDR socket option in the SOL_SOCKET Socket Options
/// reference, Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE, and SO_EXCLUSIVEADDRUSE.
/// </term>
/// </item>
/// <item>
/// <term>WSAEADDRNOTAVAIL</term>
/// <term>
/// The requested address is not valid in its context. This error is returned if the specified address pointed to by the name
/// parameter is not a valid local IP address on this computer.
/// </term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The system detected an invalid pointer address in attempting to use a pointer argument in a call. This error is returned if the
/// name parameter is NULL, the name or namelen parameter is not a valid part of the user address space, the namelen parameter is
/// too small, the name parameter contains an incorrect address format for the associated address family, or the first two bytes of
/// the memory block specified by name do not match the address family associated with the socket descriptor s.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>An invalid argument was supplied. This error is returned of the socket s is already bound to an address.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>
/// An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
/// This error is returned of not enough buffers are available or there are too many connections.
/// </term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>
/// An operation was attempted on something that is not a socket. This error is returned if the descriptor in the s parameter is not
/// a socket.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>bind</c> function is required on an unconnected socket before subsequent calls to the listen function. It is normally
/// used to bind to either connection-oriented (stream) or connectionless (datagram) sockets. The <c>bind</c> function may also be
/// used to bind to a raw socket (the socket was created by calling the socketfunction with the type parameter set to SOCK_RAW). The
/// <c>bind</c> function may also be used on an unconnected socket before subsequent calls to the connect, ConnectEx, WSAConnect,
/// WSAConnectByList, or WSAConnectByName functions before send operations.
/// </para>
/// <para>
/// When a socket is created with a call to the socket function, it exists in a namespace (address family), but it has no name
/// assigned to it. Use the <c>bind</c> function to establish the local association of the socket by assigning a local name to an
/// unnamed socket.
/// </para>
/// <para>A name consists of three parts when using the Internet address family:</para>
/// <list type="bullet">
/// <item>
/// <term>The address family.</term>
/// </item>
/// <item>
/// <term>A host address.</term>
/// </item>
/// <item>
/// <term>A port number that identifies the application.</term>
/// </item>
/// </list>
/// <para>
/// In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a sockaddr structure. It is cast this way
/// for Windows Sockets 1.1 compatibility. Service providers are free to regard it as a pointer to a block of memory of size
/// namelen. The first 2 bytes in this block (corresponding to the <c>sa_family</c> member of the <c>sockaddr</c> structure, the
/// <c>sin_family</c> member of the <c>sockaddr_in</c> structure, or the <c>sin6_family</c> member of the <c>sockaddr_in6</c>
/// structure) must contain the address family that was used to create the socket. Otherwise, an error WSAEFAULT occurs.
/// </para>
/// <para>
/// If an application does not care what local address is assigned, specify the constant value <c>INADDR_ANY</c> for an IPv4 local
/// address or the constant value <c>in6addr_any</c> for an IPv6 local address in the <c>sa_data</c> member of the name parameter.
/// This allows the underlying service provider to use any appropriate network address, potentially simplifying application
/// programming in the presence of multihomed hosts (that is, hosts that have more than one network interface and address).
/// </para>
/// <para>
/// For TCP/IP, if the port is specified as zero, the service provider assigns a unique port to the application from the dynamic
/// client port range. On Windows Vista and later, the dynamic client port range is a value between 49152 and 65535. This is a
/// change from Windows Server 2003 and earlier where the dynamic client port range was a value between 1025 and 5000. The maximum
/// value for the client dynamic port range can be changed by setting a value under the following registry key:
/// </para>
/// <para><c>HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters</c></para>
/// <para>
/// The <c>MaxUserPort</c> registry value sets the value to use for the maximum value of the dynamic client port range. You must
/// restart the computer for this setting to take effect.
/// </para>
/// <para>
/// On Windows Vista and later, the dynamic client port range can be viewed and changed using <c>netsh</c> commands. The dynamic
/// client port range can be set differently for UDP and TCP and also for IPv4 and IPv6. For more information, see KB 929851.
/// </para>
/// <para>
/// The application can use getsockname after calling <c>bind</c> to learn the address and the port that has been assigned to the
/// socket. If the Internet address is equal to <c>INADDR_ANY</c> or <c>in6addr_any</c>, <c>getsockname</c> cannot necessarily
/// supply the address until the socket is connected, since several addresses can be valid if the host is multihomed. Binding to a
/// specific port number other than port 0 is discouraged for client applications, since there is a danger of conflicting with
/// another socket already using that port number on the local computer.
/// </para>
/// <para>
/// For multicast operations, the preferred method is to call the <c>bind</c> function to associate a socket with a local IP address
/// and then join the multicast group. Although this order of operations is not mandatory, it is strongly recommended. So a
/// multicast application would first select an IPv4 or IPv6 address on the local computer, the wildcard IPv4 address (
/// <c>INADDR_ANY</c>), or the wildcard IPv6 address ( <c>in6addr_any</c>). The the multicast application would then call the
/// <c>bind</c> function with this address in the in the <c>sa_data</c> member of the name parameter to associate the local IP
/// address with the socket. If a wildcard address was specified, then Windows will select the local IP address to use. After the
/// <c>bind</c> function completes, an application would then join the multicast group of interest. For more information on how to
/// join a multicast group, see the section on Multicast Programming. This socket can then be used to receive multicast packets from
/// the multicast group using the recv, recvfrom, WSARecv, WSARecvEx, WSARecvFrom, or WSARecvMsg functions.
/// </para>
/// <para>
/// The <c>bind</c> function is not normally required for send operations to a multicast group. The sendto,WSASendMsg, and WSASendTo
/// functions implicitly bind the socket to the wildcard address if the socket is not already bound. The <c>bind</c> function is
/// required before the use of the send or WSASend functions which do not perform an implicit bind and are allowed only on connected
/// sockets, which means the socket must have already been bound for it to be connected. The <c>bind</c> function might be used
/// before send operations using the <c>sendto</c>, <c>WSASendMsg</c>, or <c>WSASendTo</c> functions if an application wanted to
/// select a specific local IP address on a local computer with multiple network interfaces and local IP addresses. Otherwise an
/// implicit bind to the wildcard address using the <c>sendto</c>, <c>WSASendMsg</c> , or <c>WSASendTo</c> functions might result in
/// a different local IP address being used for send operations.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>bind</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Notes for IrDA Sockets</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>
/// Local names are not exposed in IrDA. IrDA client sockets therefore, must never call the <c>bind</c> function before the connect
/// function. If the IrDA socket was previously bound to a service name using <c>bind</c>, the <c>connect</c> function will fail
/// with SOCKET_ERROR.
/// </term>
/// </item>
/// <item>
/// <term>
/// If the service name is of the form "LSAP-SELxxx," where xxx is a decimal integer in the range 1-127, the address indicates a
/// specific LSAP-SEL xxx rather than a service name. Service names such as these allow server applications to accept incoming
/// connections directed to a specific LSAP-SEL, without first performing an ISA service name query to get the associated LSAP-SEL.
/// One example of this service name type is a non-Windows device that does not support IAS.
/// </term>
/// </item>
/// </list>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example demonstrates the use of the <c>bind</c> function. For another example that uses the <c>bind</c> function,
/// see Getting Started With Winsock.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-bind int bind( SOCKET s, const sockaddr *addr, int
// namelen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "3a651daa-7404-4ef7-8cff-0d3dff41a8e8")]
public static extern WSRESULT bind(SOCKET s, [In] SOCKADDR addr, int namelen);
/// <summary>The <c>closesocket</c> function closes an existing socket.</summary>
/// <param name="s">A descriptor identifying the socket to close.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>closesocket</c> returns zero. Otherwise, a value of <c>SOCKET_ERROR</c> is returned, and a specific error
/// code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>The (blocking) Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>
/// The socket is marked as nonblocking, but the l_onoff member of the linger structure is set to nonzero and the l_linger member of
/// the linger structure is set to a nonzero timeout value.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>closesocket</c> function closes a socket. Use it to release the socket descriptor passed in the s parameter. Note that
/// the socket descriptor passed in the s parameter may immediately be reused by the system as soon as <c>closesocket</c> function
/// is issued. As a result, it is not reliable to expect further references to the socket descriptor passed in the s parameter to
/// fail with the error WSAENOTSOCK. A Winsock client must never issue <c>closesocket</c> on s concurrently with another Winsock
/// function call.
/// </para>
/// <para>
/// Any pending overlapped send and receive operations ( WSASend/ WSASendTo/ WSARecv/ WSARecvFrom with an overlapped socket) issued
/// by any thread in this process are also canceled. Any event, completion routine, or completion port action specified for these
/// overlapped operations is performed. The pending overlapped operations fail with the error status WSA_OPERATION_ABORTED.
/// </para>
/// <para>
/// An application should not assume that any outstanding I/O operations on a socket will all be guaranteed to completed when
/// <c>closesocket</c> returns. The <c>closesocket</c> function will initiate cancellation on the outstanding I/O operations, but
/// that does not mean that an application will receive I/O completion for these I/O operations by the time the <c>closesocket</c>
/// function returns. Thus, an application should not cleanup any resources (WSAOVERLAPPED structures, for example) referenced by
/// the outstanding I/O requests until the I/O requests are indeed completed.
/// </para>
/// <para>
/// An application should always have a matching call to <c>closesocket</c> for each successful call to socket to return any socket
/// resources to the system.
/// </para>
/// <para>
/// The linger structure maintains information about a specific socket that specifies how that socket should behave when data is
/// queued to be sent and the <c>closesocket</c> function is called on the socket.
/// </para>
/// <para>
/// The <c>l_onoff</c> member of the <c>linger</c> structure determines whether a socket should remain open for a specified amount
/// of time after a <c>closesocket</c> function call to enable queued data to be sent. This member can be modified in two ways:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// Call the setsockopt function with the optname parameter set to <c>SO_DONTLINGER</c>. The optval parameter determines how the
/// <c>l_onoff</c> member is modified.
/// </term>
/// </item>
/// <item>
/// <term>
/// Call the setsockopt function with the optname parameter set to <c>SO_LINGER</c>. The optval parameter specifies how both the
/// <c>l_onoff</c> and <c>l_linger</c> members are modified.
/// </term>
/// </item>
/// </list>
/// <para>
/// The <c>l_linger</c> member of the <c>linger</c> structure determines the amount of time, in seconds, a socket should remain
/// open. This member is only applicable if the <c>l_onoff</c> member of the <c>linger</c> structure is nonzero.
/// </para>
/// <para>
/// The default parameters for a socket are the <c>l_onoff</c> member of the <c>linger</c> structure is zero, indicating that the
/// socket should not remain open. The default value for the <c>l_linger</c> member of the <c>linger</c> structure is zero, but this
/// value is ignored when the <c>l_onoff</c> member is set to zero.
/// </para>
/// <para>
/// To enable a socket to remain open, an application should set the <c>l_onoff</c> member to a nonzero value and set the
/// <c>l_linger</c> member to the desired timeout in seconds. To disable a socket from remaining open, an application only needs to
/// set the <c>l_onoff</c> member of the <c>linger</c> structure to zero.
/// </para>
/// <para>
/// If an application calls the setsockopt function with the optname parameter set to <c>SO_DONTLINGER</c> to set the <c>l_onoff</c>
/// member to a nonzero value, the value for the <c>l_linger</c> member is not specified. In this case, the timeout used is
/// implementation dependent. If a previous timeout has been established for a socket (by previously calling the <c>setsockopt</c>
/// function with the optname parameter set to <c>SO_LINGER</c>), this timeout value should be reinstated by the service provider.
/// </para>
/// <para>
/// The semantics of the <c>closesocket</c> function are affected by the socket options that set members of <c>linger</c> structure.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>l_onoff</term>
/// <term>l_linger</term>
/// <term>Type of close</term>
/// <term>Wait for close?</term>
/// </listheader>
/// <item>
/// <term>zero</term>
/// <term>Do not care</term>
/// <term>Graceful close</term>
/// <term>No</term>
/// </item>
/// <item>
/// <term>nonzero</term>
/// <term>zero</term>
/// <term>Hard</term>
/// <term>No</term>
/// </item>
/// <item>
/// <term>nonzero</term>
/// <term>nonzero</term>
/// <term>
/// Graceful if all data is sent within timeout value specified in the l_linger member. Hard if all data could not be sent within
/// timeout value specified in the l_linger member.
/// </term>
/// <term>Yes</term>
/// </item>
/// </list>
/// <para>
/// If the <c>l_onoff</c> member of the LINGER structure is zero on a stream socket, the <c>closesocket</c> call will return
/// immediately and does not receive WSAEWOULDBLOCK whether the socket is blocking or nonblocking. However, any data queued for
/// transmission will be sent, if possible, before the underlying socket is closed. This is also called a graceful disconnect or
/// close. In this case, the Windows Sockets provider cannot release the socket and other resources for an arbitrary period, thus
/// affecting applications that expect to use all available sockets. This is the default behavior for a socket.
/// </para>
/// <para>
/// If the <c>l_onoff</c> member of the linger structure is nonzero and <c>l_linger</c> member is zero, <c>closesocket</c> is not
/// blocked even if queued data has not yet been sent or acknowledged. This is called a hard or abortive close, because the socket's
/// virtual circuit is reset immediately, and any unsent data is lost. On Windows, any <c>recv</c> call on the remote side of the
/// circuit will fail with WSAECONNRESET.
/// </para>
/// <para>
/// If the <c>l_onoff</c> member of the linger structure is set to nonzero and <c>l_linger</c> member is set to a nonzero timeout on
/// a blocking socket, the <c>closesocket</c> call blocks until the remaining data has been sent or until the timeout expires. This
/// is called a graceful disconnect or close if all of the data is sent within timeout value specified in the <c>l_linger</c>
/// member. If the timeout expires before all data has been sent, the Windows Sockets implementation terminates the connection
/// before <c>closesocket</c> returns and this is called a hard or abortive close.
/// </para>
/// <para>
/// Setting the <c>l_onoff</c> member of the linger structure to nonzero and the <c>l_linger</c> member with a nonzero timeout
/// interval on a nonblocking socket is not recommended. In this case, the call to <c>closesocket</c> will fail with an error of
/// WSAEWOULDBLOCK if the close operation cannot be completed immediately. If <c>closesocket</c> fails with WSAEWOULDBLOCK the
/// socket handle is still valid, and a disconnect is not initiated. The application must call <c>closesocket</c> again to close the socket.
/// </para>
/// <para>
/// If the <c>l_onoff</c> member of the linger structure is nonzero and the <c>l_linger</c> member is a nonzero timeout interval on
/// a blocking socket, the result of the <c>closesocket</c> function can't be used to determine whether all data has been sent to
/// the peer. If the data is sent before the timeout specified in the <c>l_linger</c> member expires or if the connection was
/// aborted, the <c>closesocket</c> function won't return an error code (the return value from the <c>closesocket</c> function is zero).
/// </para>
/// <para>
/// The <c>closesocket</c> call will only block until all data has been delivered to the peer or the timeout expires. If the
/// connection is reset because the timeout expires, then the socket will not go into TIME_WAIT state. If all data is sent within
/// the timeout period, then the socket can go into TIME_WAIT state.
/// </para>
/// <para>
/// If the <c>l_onoff</c> member of the linger structure is nonzero and the <c>l_linger</c> member is a zero timeout interval on a
/// blocking socket, then a call to <c>closesocket</c> will reset the connection. The socket will not go to the TIME_WAIT state.
/// </para>
/// <para>
/// The getsockopt function can be called with the optname parameter set to <c>SO_LINGER</c> to retrieve the current value of the
/// <c>linger</c> structure associated with a socket.
/// </para>
/// <para>
/// <c>Note</c> To assure that all data is sent and received on a connection, an application should call shutdown before calling
/// <c>closesocket</c> (see Graceful shutdown, linger options, and socket closure for more information). Also note, an FD_CLOSE
/// network event is not posted after <c>closesocket</c> is called.
/// </para>
/// <para>Here is a summary of <c>closesocket</c> behavior:</para>
/// <list type="bullet">
/// <item>
/// <term>
/// If the <c>l_onoff</c> member of the LINGER structure is zero (the default for a socket), <c>closesocket</c> returns immediately
/// and the connection is gracefully closed in the background.
/// </term>
/// </item>
/// <item>
/// <term>
/// If the <c>l_onoff</c> member of the linger structure is set to nonzero and the <c>l_linger</c> member is set to zero (no
/// timeout) <c>closesocket</c> returns immediately and the connection is reset or terminated.
/// </term>
/// </item>
/// <item>
/// <term>
/// If the <c>l_onoff</c> member of the linger structure is set to nonzero and the <c>l_linger</c> member is set to a nonzero
/// timeout: For a blocking socket, <c>closesocket</c> blocks until all data is sent or the timeout expires.
/// </term>
/// </item>
/// </list>
/// <para>For additional information please see Graceful Shutdown, Linger Options, and Socket Closure for more information.</para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>closesocket</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Notes for IrDA Sockets</para>
/// <para>Keep the following in mind:</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>The standard linger options are supported.</term>
/// </item>
/// <item>
/// <term>
/// Although IrDA does not provide a graceful close, IrDA will defer closing until receive queues are purged. Thus, an application
/// can send data and immediately call the socket function, and be confident that the receiver will copy the data before receiving
/// an FD_CLOSE message.
/// </term>
/// </item>
/// </list>
/// <para>Notes for ATM</para>
/// <para>
/// The following are important issues associated with connection teardown when using Asynchronous Transfer Mode (ATM) and Windows
/// Sockets 2:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// Using the <c>closesocket</c> or shutdown functions with SD_SEND or SD_BOTH results in a RELEASE signal being sent out on the
/// control channel. Due to ATM's use of separate signal and data channels, it is possible that a RELEASE signal could reach the
/// remote end before the last of the data reaches its destination, resulting in a loss of that data. One possible solutions is
/// programming a sufficient delay between the last data sent and the <c>closesocket</c> or shutdown function calls for an ATM socket.
/// </term>
/// </item>
/// <item>
/// <term>Half close is not supported by ATM.</term>
/// </item>
/// <item>
/// <term>
/// Both abortive and graceful disconnects result in a RELEASE signal being sent out with the same cause field. In either case,
/// received data at the remote end of the socket is still delivered to the application. See Graceful Shutdown, Linger Options, and
/// Socket Closure for more information.
/// </term>
/// </item>
/// </list>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-closesocket int closesocket( IN SOCKET s );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "2f357aa8-389b-4c92-8a9f-289e048cc41c")]
public static extern WSRESULT closesocket([In] SOCKET s);
/// <summary>The <c>connect</c> function establishes a connection to a specified socket.</summary>
/// <param name="s">A descriptor identifying an unconnected socket.</param>
/// <param name="name">A pointer to the sockaddr structure to which the connection should be established.</param>
/// <param name="namelen">The length, in bytes, of the sockaddr structure pointed to by the name parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>connect</c> returns zero. Otherwise, it returns SOCKET_ERROR, and a specific error code can be retrieved
/// by calling WSAGetLastError.
/// </para>
/// <para>On a blocking socket, the return value indicates success or failure of the connection attempt.</para>
/// <para>
/// With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, <c>connect</c> will return
/// SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. In this case, there are three possible scenarios:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>Use the select function to determine the completion of the connection request by checking to see if the socket is writeable.</term>
/// </item>
/// <item>
/// <term>
/// If the application is using WSAAsyncSelect to indicate interest in connection events, then the application will receive an
/// FD_CONNECT notification indicating that the <c>connect</c> operation is complete (successfully or not).
/// </term>
/// </item>
/// <item>
/// <term>
/// If the application is using WSAEventSelect to indicate interest in connection events, then the associated event object will be
/// signaled indicating that the <c>connect</c> operation is complete (successfully or not).
/// </term>
/// </item>
/// </list>
/// <para>
/// Until the connection attempt completes on a nonblocking socket, all subsequent calls to <c>connect</c> on the same socket will
/// fail with the error code WSAEALREADY, and WSAEISCONN when the connection completes successfully. Due to ambiguities in version
/// 1.1 of the Windows Sockets specification, error codes returned from <c>connect</c> while a connection is already pending may
/// vary among implementations. As a result, it is not recommended that applications use multiple calls to connect to detect
/// connection completion. If they do, they must be prepared to handle WSAEINVAL and WSAEWOULDBLOCK error values the same way that
/// they handle WSAEALREADY, to assure robust operation.
/// </para>
/// <para>
/// If the error code returned indicates the connection attempt failed (that is, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT) the
/// application can call <c>connect</c> again for the same socket.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEADDRINUSE</term>
/// <term>
/// The socket's local address is already in use and the socket was not marked to allow address reuse with SO_REUSEADDR. This error
/// usually occurs when executing bind, but could be delayed until the connect function if the bind was to a wildcard address
/// (INADDR_ANY or in6addr_any) for the local IP address. A specific address needs to be implicitly bound by the connect function.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>The blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEALREADY</term>
/// <term>A nonblocking connect call is in progress on the specified socket.</term>
/// </item>
/// <item>
/// <term>WSAEADDRNOTAVAIL</term>
/// <term>The remote address is not a valid address (such as INADDR_ANY or in6addr_any) .</term>
/// </item>
/// <item>
/// <term>WSAEAFNOSUPPORT</term>
/// <term>Addresses in the specified family cannot be used with this socket.</term>
/// </item>
/// <item>
/// <term>WSAECONNREFUSED</term>
/// <term>The attempt to connect was forcefully rejected.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The sockaddr structure pointed to by the name contains incorrect address format for the associated address family or the namelen
/// parameter is too small. This error is also returned if the sockaddr structure pointed to by the name parameter with a length
/// specified in the namelen parameter is not in a valid part of the user address space.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The parameter s is a listening socket.</term>
/// </item>
/// <item>
/// <term>WSAEISCONN</term>
/// <term>The socket is already connected (connection-oriented sockets only).</term>
/// </item>
/// <item>
/// <term>WSAENETUNREACH</term>
/// <term>The network cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>A socket operation was attempted to an unreachable host.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term></term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor specified in the s parameter is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>An attempt to connect timed out without establishing a connection.</term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the connection cannot be completed immediately.</term>
/// </item>
/// <item>
/// <term>WSAEACCES</term>
/// <term>An attempt to connect a datagram socket to broadcast address failed because setsockopt option SO_BROADCAST is not enabled.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>connect</c> function is used to create a connection to the specified destination. If socket s, is unbound, unique values
/// are assigned to the local association by the system, and the socket is marked as bound.
/// </para>
/// <para>
/// For connection-oriented sockets (for example, type SOCK_STREAM), an active connection is initiated to the foreign host using
/// name (an address in the namespace of the socket; for a detailed description, see bind and sockaddr).
/// </para>
/// <para>
/// When the socket call completes successfully, the socket is ready to send and receive data. If the address member of the
/// structure specified by the name parameter is filled with zeros, <c>connect</c> will return the error WSAEADDRNOTAVAIL. Any
/// attempt to reconnect an active connection will fail with the error code WSAEISCONN.
/// </para>
/// <para>
/// For connection-oriented, nonblocking sockets, it is often not possible to complete the connection immediately. In such a case,
/// this function returns the error WSAEWOULDBLOCK. However, the operation proceeds.
/// </para>
/// <para>
/// When the success or failure outcome becomes known, it may be reported in one of two ways, depending on how the client registers
/// for notification.
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// If the client uses the select function, success is reported in the writefds set and failure is reported in the exceptfds set.
/// </term>
/// </item>
/// <item>
/// <term>
/// If the client uses the functions WSAAsyncSelect or WSAEventSelect, the notification is announced with FD_CONNECT and the error
/// code associated with the FD_CONNECT indicates either success or a specific reason for failure.
/// </term>
/// </item>
/// </list>
/// <para>
/// For a connectionless socket (for example, type SOCK_DGRAM), the operation performed by <c>connect</c> is merely to establish a
/// default destination address that can be used on subsequent send/ WSASend and recv/ WSARecv calls. Any datagrams received from an
/// address other than the destination address specified will be discarded. If the address member of the structure specified by name
/// is filled with zeros, the socket will be disconnected. Then, the default remote address will be indeterminate, so send/ WSASend
/// and recv/ WSARecv calls will return the error code WSAENOTCONN. However, sendto/ WSASendTo and recvfrom/ WSARecvFrom can still
/// be used. The default destination can be changed by simply calling <c>connect</c> again, even if the socket is already connected.
/// Any datagrams queued for receipt are discarded if name is different from the previous <c>connect</c>.
/// </para>
/// <para>
/// For connectionless sockets, name can indicate any valid address, including a broadcast address. However, to connect to a
/// broadcast address, a socket must use setsockopt to enable the SO_BROADCAST option. Otherwise, <c>connect</c> will fail with the
/// error code WSAEACCES.
/// </para>
/// <para>
/// When a connection between sockets is broken, the socket that was connected should be discarded and new socket should be created.
/// When a problem develops on a connected socket, the application must discard the socket and create the socket again in order to
/// return to a stable point.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>connect</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>connect</c> function.</para>
/// <para>For another example that uses the <c>connect</c> function, see Getting Started With Winsock.</para>
/// <para>Notes for IrDA Sockets</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>If an existing IrDA connection is detected at the media-access level, WSAENETDOWN is returned.</term>
/// </item>
/// <item>
/// <term>If active connections to a device with a different address exist, WSAEADDRINUSE is returned.</term>
/// </item>
/// <item>
/// <term>If the socket is already connected or an exclusive/multiplexed mode change failed, WSAEISCONN is returned.</term>
/// </item>
/// <item>
/// <term>
/// If the socket was previously bound to a local service name to accept incoming connections using bind, WSAEINVAL is returned.
/// Note that once a socket is bound, it cannot be used for establishing an outbound connection.
/// </term>
/// </item>
/// </list>
/// <para>
/// IrDA implements the connect function with addresses of the form sockaddr_irda. Typically, a client application will create a
/// socket with the socket function, scan the immediate vicinity for IrDA devices with the IRLMP_ENUMDEVICES socket option, choose a
/// device from the returned list, form an address, and then call <c>connect</c>. There is no difference between blocking and
/// nonblocking semantics.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-connect int WSAAPI connect( SOCKET s, const sockaddr
// *name, int namelen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "13468139-dc03-45bd-850c-7ac2dbcb6e60")]
public static extern WSRESULT connect(SOCKET s, SOCKADDR name, int namelen);
/// <summary>The <c>gethostname</c> function retrieves the standard host name for the local computer.</summary>
/// <param name="name">A pointer to a buffer that receives the local host name.</param>
/// <param name="namelen">The length, in bytes, of the buffer pointed to by the name parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>gethostname</c> returns zero. Otherwise, it returns SOCKET_ERROR and a specific error code can be
/// retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The name parameter is a NULL pointer or is not a valid part of the user address space. This error is also returned if the buffer
/// size specified by namelen parameter is too small to hold the complete host name.
/// </term>
/// </item>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>gethostname</c> function returns the name of the local host into the buffer specified by the name parameter. The host
/// name is returned as a <c>null</c>-terminated string. The form of the host name is dependent on the Windows Sockets provider—it
/// can be a simple host name, or it can be a fully qualified domain name. However, it is guaranteed that the name returned will be
/// successfully parsed by gethostbyname and WSAAsyncGetHostByName.
/// </para>
/// <para>The maximum length of the name returned in the buffer pointed to by the name parameter is dependent on the namespace provider.</para>
/// <para>
/// If the <c>gethostname</c> function is used on a cluster resource on Windows Server 2008, Windows Server 2003, or Windows 2000
/// Server and the CLUSTER_NETWORK_NAME environment variable is defined, then the value in this environment variable overrides the
/// actual hostname and is returned. On a cluster resource, the CLUSTER_NETWORK_NAME environment variable contains the name of the cluster.
/// </para>
/// <para>
/// The <c>gethostname</c> function queries namespace providers to determine the local host name using the SVCID_HOSTNAME GUID
/// defined in the Svgguid.h header file. If no namespace provider responds, then the <c>gethostname</c> function returns the
/// NetBIOS name of the local computer.
/// </para>
/// <para>
/// The maximum length, in bytes, of the string returned in the buffer pointed to by the name parameter is dependent on the
/// namespace provider, but this string must be 256 bytes or less. So if a buffer of 256 bytes is passed in the name parameter and
/// the namelen parameter is set to 256, the buffer size will always be adequate.
/// </para>
/// <para>
/// <c>Note</c> If no local host name has been configured, <c>gethostname</c> must succeed and return a token host name that
/// gethostbyname or WSAAsyncGetHostByName can resolve.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-gethostname int gethostname( char *name, int namelen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("winsock.h", MSDNShortId = "8fa40b60-0e93-493b-aee1-cea6cf595707")]
public static extern WSRESULT gethostname(StringBuilder name, int namelen);
/// <summary>The <c>GetHostNameW</c> function retrieves the standard host name for the local computer as a Unicode string.</summary>
/// <param name="name">A pointer to a buffer that receives the local host name as a <c>null</c>-terminated Unicode string.</param>
/// <param name="namelen">The length, in wide characters, of the buffer pointed to by the name parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>GetHostNameW</c> returns zero. Otherwise, it returns <c>SOCKET_ERROR</c> and a specific error code can be
/// retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The name parameter is a NULL pointer or is not a valid part of the user address space. This error is also returned if the buffer
/// size specified by namelen parameter is too small to hold the complete host name.
/// </term>
/// </item>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>GetHostNameW</c> function returns the name of the local host into the buffer specified by the name parameter in Unicode
/// (UTF-16). The host name is returned as a <c>null</c>-terminated Unicode string. The form of the host name is dependent on the
/// Windows Sockets provider—it can be a simple host name, or it can be a fully qualified domain name. However, it is guaranteed
/// that the name returned will be successfully parsed by GetAddrInfoW.
/// </para>
/// <para>
/// With the growth of the Internet, there is a growing need to identify Internet host names for other languages not represented by
/// the ASCII character set. Identifiers which facilitate this need and allow non-ASCII characters (Unicode) to be represented as
/// special ASCII character strings (Punycode) are known as Internationalized Domain Names (IDNs). A mechanism called
/// Internationalizing Domain Names in Applications (IDNA) is used to handle IDNs in a standard fashion. The <c>GetHostNameW</c>
/// function does not convert the local hostname between Punycode and Unicode. The GetAddrInfoW function provides support for
/// Internationalized Domain Name (IDN) parsing and performs Punycode/IDN encoding and conversion.
/// </para>
/// <para>
/// If the <c>GetHostNameW</c> function is used on a cluster resource on Windows Server 2012 and the CLUSTER_NETWORK_NAME
/// environment variable is defined, then the value in this environment variable overrides the actual hostname and is returned. On a
/// cluster resource, the CLUSTER_NETWORK_NAME environment variable contains the name of the cluster.
/// </para>
/// <para>
/// The <c>GetHostNameW</c> function queries namespace providers to determine the local host name using the SVCID_HOSTNAME GUID
/// defined in the Svgguid.h header file. If no namespace provider responds, then the <c>GetHostNameW</c> function returns the
/// NetBIOS name of the local computer in Unicode.
/// </para>
/// <para>
/// The maximum length, in wide characters, of the string returned in the buffer pointed to by the name parameter is dependent on
/// the namespace provider, but this string must be 256 wide characters or less. So if a buffer of 256 wide characters is passed in
/// the name parameter and the namelen parameter is set to 256, the buffer size will always be adequate.
/// </para>
/// <para>
/// <c>Note</c> If no local host name has been configured, <c>GetHostNameW</c> must succeed and return a token host name that
/// GetAddrInfoW can resolve.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-gethostnamew int WSAAPI GetHostNameW( PWSTR name, int
// namelen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
[PInvokeData("winsock2.h", MSDNShortId = "787EB209-5944-4F0A-8550-FE1115C2298A")]
public static extern WSRESULT GetHostNameW(StringBuilder name, int namelen);
/// <summary>The <c>getpeername</c> function retrieves the address of the peer to which a socket is connected.</summary>
/// <param name="s">A descriptor identifying a connected socket.</param>
/// <param name="name">The SOCKADDR structure that receives the address of the peer.</param>
/// <param name="namelen">A pointer to the size, in bytes, of the name parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>getpeername</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code
/// can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The name or the namelen parameter is not in a valid part of the user address space, or the namelen parameter is too small.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>getpeername</c> function retrieves the address of the peer connected to the socket s and stores the address in the
/// SOCKADDR structure identified by the name parameter. This function works with any address family and it simply returns the
/// address to which the socket is connected. The <c>getpeername</c> function can be used only on a connected socket.
/// </para>
/// <para>
/// For datagram sockets, only the address of a peer specified in a previous connect call will be returned. Any address specified by
/// a previous sendto call will not be returned by <c>getpeername</c>.
/// </para>
/// <para>
/// On call, the namelen parameter contains the size, in bytes, of the name buffer. On return, the namelen parameter contains the
/// actual size, in bytes, of the name parameter returned.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getpeername int getpeername( SOCKET s, sockaddr *name, int
// *namelen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "df2679a5-cdd9-468b-823a-f98044189f65")]
public static extern WSRESULT getpeername(SOCKET s, SOCKADDR name, ref int namelen);
/// <summary>The <c>getprotobyname</c> function retrieves the protocol information corresponding to a protocol name.</summary>
/// <param name="name">Pointer to a null-terminated protocol name.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>getprotobyname</c> returns a pointer to the protoent. Otherwise, it returns a null pointer and a specific
/// error number can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAHOST_NOT_FOUND</term>
/// <term>Authoritative answer protocol not found.</term>
/// </item>
/// <item>
/// <term>WSATRY_AGAIN</term>
/// <term>A nonauthoritative protocol not found, or server failure.</term>
/// </item>
/// <item>
/// <term>WSANO_RECOVERY</term>
/// <term>Nonrecoverable errors, the protocols database is not accessible.</term>
/// </item>
/// <item>
/// <term>WSANO_DATA</term>
/// <term>Valid name, no data record of requested type.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The name parameter is not a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>getprotobyname</c> function returns a pointer to the protoent structure containing the name(s) and protocol number that
/// correspond to the protocol specified in the name parameter. All strings are null-terminated. The <c>protoent</c> structure is
/// allocated by the Windows Sockets library. An application must never attempt to modify this structure or to free any of its
/// components. Furthermore, like hostent, only one copy of this structure is allocated per thread, so the application should copy
/// any information that it needs before issuing any other Windows Sockets function calls.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getprotobyname protoent * getprotobyname( const char *name );
[DllImport(Lib.Ws2_32, SetLastError = true, EntryPoint = "getprotobyname", CharSet = CharSet.Ansi)]
[PInvokeData("winsock.h", MSDNShortId = "00669525-d477-4607-beaa-61ef5a8dbd4f")]
public static extern unsafe PROTOENT* getprotobyname_unsafe(string name);
/// <summary>The <c>getprotobyname</c> function retrieves the protocol information corresponding to a protocol name.</summary>
/// <param name="name">Pointer to a null-terminated protocol name.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>getprotobyname</c> returns a pointer to the protoent. Otherwise, it returns a null pointer and a specific
/// error number can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAHOST_NOT_FOUND</term>
/// <term>Authoritative answer protocol not found.</term>
/// </item>
/// <item>
/// <term>WSATRY_AGAIN</term>
/// <term>A nonauthoritative protocol not found, or server failure.</term>
/// </item>
/// <item>
/// <term>WSANO_RECOVERY</term>
/// <term>Nonrecoverable errors, the protocols database is not accessible.</term>
/// </item>
/// <item>
/// <term>WSANO_DATA</term>
/// <term>Valid name, no data record of requested type.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The name parameter is not a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>getprotobyname</c> function returns a pointer to the protoent structure containing the name(s) and protocol number that
/// correspond to the protocol specified in the name parameter. All strings are null-terminated. The <c>protoent</c> structure is
/// allocated by the Windows Sockets library. An application must never attempt to modify this structure or to free any of its
/// components. Furthermore, like hostent, only one copy of this structure is allocated per thread, so the application should copy
/// any information that it needs before issuing any other Windows Sockets function calls.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getprotobyname protoent * getprotobyname( const char *name );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("winsock.h", MSDNShortId = "00669525-d477-4607-beaa-61ef5a8dbd4f")]
public static extern IntPtr getprotobyname(string name);
/// <summary>The <c>getprotobynumber</c> function retrieves protocol information corresponding to a protocol number.</summary>
/// <param name="number"/>
/// <returns>
/// <para>
/// If no error occurs, <c>getprotobynumber</c> returns a pointer to the protoent structure. Otherwise, it returns a null pointer
/// and a specific error number can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAHOST_NOT_FOUND</term>
/// <term>Authoritative answer protocol not found.</term>
/// </item>
/// <item>
/// <term>WSATRY_AGAIN</term>
/// <term>A nonauthoritative Protocol not found, or server failure.</term>
/// </item>
/// <item>
/// <term>WSANO_RECOVERY</term>
/// <term>Nonrecoverable errors, the protocols database is not accessible.</term>
/// </item>
/// <item>
/// <term>WSANO_DATA</term>
/// <term>Valid name, no data record of requested type.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// This <c>getprotobynumber</c> function returns a pointer to the protoent structure as previously described in getprotobyname. The
/// contents of the structure correspond to the given protocol number.
/// </para>
/// <para>
/// The pointer that is returned points to the structure allocated by Windows Sockets. The application must never attempt to modify
/// this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the
/// application should copy any information that it needs before issuing any other Windows Sockets function calls.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getprotobynumber protoent *WSAAPI getprotobynumber( int
// number );
[DllImport(Lib.Ws2_32, SetLastError = true, EntryPoint = "getprotobynumber")]
[PInvokeData("winsock2.h", MSDNShortId = "f1f55ab7-01ca-4ed7-b8f9-e7ddbaa95855")]
public static extern unsafe PROTOENT* getprotobynumber_unsafe(int number);
/// <summary>The <c>getprotobynumber</c> function retrieves protocol information corresponding to a protocol number.</summary>
/// <param name="number"/>
/// <returns>
/// <para>
/// If no error occurs, <c>getprotobynumber</c> returns a pointer to the protoent structure. Otherwise, it returns a null pointer
/// and a specific error number can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAHOST_NOT_FOUND</term>
/// <term>Authoritative answer protocol not found.</term>
/// </item>
/// <item>
/// <term>WSATRY_AGAIN</term>
/// <term>A nonauthoritative Protocol not found, or server failure.</term>
/// </item>
/// <item>
/// <term>WSANO_RECOVERY</term>
/// <term>Nonrecoverable errors, the protocols database is not accessible.</term>
/// </item>
/// <item>
/// <term>WSANO_DATA</term>
/// <term>Valid name, no data record of requested type.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// This <c>getprotobynumber</c> function returns a pointer to the protoent structure as previously described in getprotobyname. The
/// contents of the structure correspond to the given protocol number.
/// </para>
/// <para>
/// The pointer that is returned points to the structure allocated by Windows Sockets. The application must never attempt to modify
/// this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the
/// application should copy any information that it needs before issuing any other Windows Sockets function calls.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getprotobynumber protoent *WSAAPI getprotobynumber( int
// number );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "f1f55ab7-01ca-4ed7-b8f9-e7ddbaa95855")]
public static extern IntPtr getprotobynumber(int number);
/// <summary>The <c>getservbyname</c> function retrieves service information corresponding to a service name and protocol.</summary>
/// <param name="name">A pointer to a <c>null</c>-terminated service name.</param>
/// <param name="proto">
/// A pointer to a <c>null</c>-terminated protocol name. If this pointer is <c>NULL</c>, the <c>getservbyname</c> function returns
/// the first service entry where name matches the <c>s_name</c> member of the servent structure or the <c>s_aliases</c> member of
/// the <c>servent</c> structure. Otherwise, <c>getservbyname</c> matches both the name and the proto.
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>getservbyname</c> returns a pointer to the servent structure. Otherwise, it returns a <c>null</c> pointer
/// and a specific error number can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAHOST_NOT_FOUND</term>
/// <term>Authoritative Answer Service not found.</term>
/// </item>
/// <item>
/// <term>WSATRY_AGAIN</term>
/// <term>A nonauthoritative Service not found, or server failure.</term>
/// </item>
/// <item>
/// <term>WSANO_RECOVERY</term>
/// <term>Nonrecoverable errors, the services database is not accessible.</term>
/// </item>
/// <item>
/// <term>WSANO_DATA</term>
/// <term>Valid name, no data record of requested type.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>getservbyname</c> function returns a pointer to the servent structure containing the name(s) and service number that
/// match the string in the name parameter. All strings are <c>null</c>-terminated.
/// </para>
/// <para>
/// The pointer that is returned points to the <c>servent</c> structure allocated by the Windows Sockets library. The application
/// must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is
/// allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getservbyname servent * getservbyname( const char *name,
// const char *proto );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("winsock.h", MSDNShortId = "730fa372-f620-4d21-99b9-3e7b79932792")]
public static extern IntPtr getservbyname(string name, [Optional] string proto);
/// <summary>The <c>getservbyport</c> function retrieves service information corresponding to a port and protocol.</summary>
/// <param name="port">Port for a service, in network byte order.</param>
/// <param name="proto">
/// Optional pointer to a protocol name. If this is null, <c>getservbyport</c> returns the first service entry for which the port
/// matches the <c>s_port</c> of the servent structure. Otherwise, <c>getservbyport</c> matches both the port and the proto parameters.
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>getservbyport</c> returns a pointer to the servent structure. Otherwise, it returns a null pointer and a
/// specific error number can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAHOST_NOT_FOUND</term>
/// <term>Authoritative Answer Service not found.</term>
/// </item>
/// <item>
/// <term>WSATRY_AGAIN</term>
/// <term>A nonauthoritative Service not found, or server failure.</term>
/// </item>
/// <item>
/// <term>WSANO_RECOVERY</term>
/// <term>Nonrecoverable errors, the services database is not accessible.</term>
/// </item>
/// <item>
/// <term>WSANO_DATA</term>
/// <term>Valid name, no data record of requested type.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The proto parameter is not a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>getservbyport</c> function returns a pointer to a servent structure as it does in the getservbyname function.</para>
/// <para>
/// The <c>servent</c> structure is allocated by Windows Sockets. The application must never attempt to modify this structure or to
/// free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy
/// any information it needs before issuing any other Windows Sockets function calls.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getservbyport servent * getservbyport( int port, const char
// *proto );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("winsock.h", MSDNShortId = "afd63c2d-4f77-49df-aeff-bfe56598fcbf")]
public static extern IntPtr getservbyport(int port, [Optional] string proto);
/// <summary>The <c>getsockname</c> function retrieves the local name for a socket.</summary>
/// <param name="s">Descriptor identifying a socket.</param>
/// <param name="name">Pointer to a SOCKADDR structure that receives the address (name) of the socket.</param>
/// <param name="namelen">Size of the name buffer, in bytes.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>getsockname</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code
/// can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this API.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The name or the namelen parameter is not a valid part of the user address space, or the namelen parameter is too small.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The socket has not been bound to an address with bind, or ADDR_ANY is specified in bind but connection has not yet occurred.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>getsockname</c> function retrieves the current name for the specified socket descriptor in name. It is used on the bound
/// or connected socket specified by the s parameter. The local association is returned. This call is especially useful when a
/// connect call has been made without doing a bind first; the <c>getsockname</c> function provides the only way to determine the
/// local association that has been set by the system.
/// </para>
/// <para>
/// On call, the namelen parameter contains the size of the name buffer, in bytes. On return, the namelen parameter contains the
/// actual size in bytes of the name parameter.
/// </para>
/// <para>
/// The <c>getsockname</c> function does not always return information about the host address when the socket has been bound to an
/// unspecified address, unless the socket has been connected with connect or accept (for example, using ADDR_ANY). A Windows
/// Sockets application must not assume that the address will be specified unless the socket is connected. The address that will be
/// used for the socket is unknown unless the socket is connected when used in a multihomed host. If the socket is using a
/// connectionless protocol, the address may not be available until I/O occurs on the socket.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-getsockname int getsockname( SOCKET s, sockaddr *name,
// int *namelen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "be20a731-cdfc-48ae-90b2-43f2cf9ecf6d")]
public static extern WSRESULT getsockname(SOCKET s, SOCKADDR name, ref int namelen);
/// <summary>The <c>getsockopt</c> function retrieves a socket option.</summary>
/// <param name="s">A descriptor identifying a socket.</param>
/// <param name="level">The level at which the option is defined. Example: SOL_SOCKET.</param>
/// <param name="optname">
/// The socket option for which the value is to be retrieved. Example: SO_ACCEPTCONN. The optname value must be a socket option
/// defined within the specified level, or behavior is undefined.
/// </param>
/// <param name="optval">A pointer to the buffer in which the value for the requested option is to be returned.</param>
/// <param name="optlen">A pointer to the size, in bytes, of the optval buffer.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>getsockopt</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code
/// can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term/>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// One of the optval or the optlen parameters is not a valid part of the user address space, or the optlen parameter is too small.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The level parameter is unknown or invalid.</term>
/// </item>
/// <item>
/// <term>WSAENOPROTOOPT</term>
/// <term>The option is unknown or unsupported by the indicated protocol family.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>getsockopt</c> function retrieves the current value for a socket option associated with a socket of any type, in any
/// state, and stores the result in optval. Options can exist at multiple protocol levels, but they are always present at the
/// uppermost socket level. Options affect socket operations, such as the packet routing and OOB data transfer.
/// </para>
/// <para>
/// The value associated with the selected option is returned in the buffer optval. The integer pointed to by optlen should
/// originally contain the size of this buffer; on return, it will be set to the size of the value returned. For SO_LINGER, this
/// will be the size of a LINGER structure. For most other options, it will be the size of an integer.
/// </para>
/// <para>
/// The application is responsible for allocating any memory space pointed to directly or indirectly by any of the parameters it specified.
/// </para>
/// <para>If the option was never set with setsockopt, then <c>getsockopt</c> returns the default value for the option.</para>
/// <para>The following options are supported for <c>getsockopt</c>. The Type column identifies the type of data addressed by optval.</para>
/// <para>For more information on socket options, see Socket Options.</para>
/// <para>The following table of value for the optname parameter are valid when the level parameter is set to <c>SOL_SOCKET</c>.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>SO_ACCEPTCONN</term>
/// <term>BOOL</term>
/// <term>The socket is listening.</term>
/// </item>
/// <item>
/// <term>SO_BROADCAST</term>
/// <term>BOOL</term>
/// <term>The socket is configured for the transmission and receipt of broadcast messages.</term>
/// </item>
/// <item>
/// <term>SO_BSP_STATE</term>
/// <term>CSADDR_INFO</term>
/// <term>Returns the local address, local port, remote address, remote port, socket type, and protocol used by a socket.</term>
/// </item>
/// <item>
/// <term>SO_CONDITIONAL_ACCEPT</term>
/// <term>BOOL</term>
/// <term>Returns current socket state, either from a previous call to setsockopt or the system default.</term>
/// </item>
/// <item>
/// <term>SO_CONNECT_TIME</term>
/// <term>DWORD</term>
/// <term>
/// Returns the number of seconds a socket has been connected. This socket option is valid for connection oriented protocols only.
/// </term>
/// </item>
/// <item>
/// <term>SO_DEBUG</term>
/// <term>BOOL</term>
/// <term>Debugging is enabled.</term>
/// </item>
/// <item>
/// <term>SO_DONTLINGER</term>
/// <term>BOOL</term>
/// <term>If TRUE, the SO_LINGER option is disabled.</term>
/// </item>
/// <item>
/// <term>SO_DONTROUTE</term>
/// <term>BOOL</term>
/// <term>
/// Routing is disabled. Setting this succeeds but is ignored on AF_INET sockets; fails on AF_INET6 sockets with WSAENOPROTOOPT.
/// This option is not supported on ATM sockets.
/// </term>
/// </item>
/// <item>
/// <term>SO_ERROR</term>
/// <term>int</term>
/// <term>Retrieves error status and clear.</term>
/// </item>
/// <item>
/// <term>SO_EXCLUSIVEADDRUSE</term>
/// <term>BOOL</term>
/// <term>Prevents any other socket from binding to the same address and port. This option must be set before calling the bind function.</term>
/// </item>
/// <item>
/// <term>SO_GROUP_ID</term>
/// <term>GROUP</term>
/// <term>Reserved.</term>
/// </item>
/// <item>
/// <term>SO_GROUP_PRIORITY</term>
/// <term>int</term>
/// <term>Reserved.</term>
/// </item>
/// <item>
/// <term>SO_KEEPALIVE</term>
/// <term>BOOL</term>
/// <term>Keep-alives are being sent. Not supported on ATM sockets.</term>
/// </item>
/// <item>
/// <term>SO_LINGER</term>
/// <term>LINGER structure</term>
/// <term>Returns the current linger options.</term>
/// </item>
/// <item>
/// <term>SO_MAX_MSG_SIZE</term>
/// <term>unsigned int</term>
/// <term>
/// The maximum size of a message for message-oriented socket types (for example, SOCK_DGRAM). Has no meaning for stream oriented sockets.
/// </term>
/// </item>
/// <item>
/// <term>SO_OOBINLINE</term>
/// <term>BOOL</term>
/// <term>
/// OOB data is being received in the normal data stream. (See section Windows Sockets 1.1 Blocking Routines and EINPROGRESS for a
/// discussion of this topic.)
/// </term>
/// </item>
/// <item>
/// <term>SO_PORT_SCALABILITY</term>
/// <term>BOOL</term>
/// <term>
/// Enables local port scalability for a socket by allowing port allocation to be maximized by allocating wildcard ports multiple
/// times for different local address port pairs on a local machine.
/// </term>
/// </item>
/// <item>
/// <term>SO_PROTOCOL_INFO</term>
/// <term>WSAPROTOCOL_INFO</term>
/// <term>A description of the protocol information for the protocol that is bound to this socket.</term>
/// </item>
/// <item>
/// <term>SO_RCVBUF</term>
/// <term>int</term>
/// <term>
/// The total per-socket buffer space reserved for receives. This is unrelated to SO_MAX_MSG_SIZE and does not necessarily
/// correspond to the size of the TCP receive window.
/// </term>
/// </item>
/// <item>
/// <term>SO_REUSEADDR</term>
/// <term>BOOL</term>
/// <term>The socket can be bound to an address which is already in use. Not applicable for ATM sockets.</term>
/// </item>
/// <item>
/// <term>SO_SNDBUF</term>
/// <term>int</term>
/// <term>
/// The total per-socket buffer space reserved for sends. This is unrelated to SO_MAX_MSG_SIZE and does not necessarily correspond
/// to the size of a TCP send window.
/// </term>
/// </item>
/// <item>
/// <term>SO_TYPE</term>
/// <term>int</term>
/// <term>The type of the socket (for example, SOCK_STREAM).</term>
/// </item>
/// <item>
/// <term>PVD_CONFIG</term>
/// <term>Service Provider Dependent</term>
/// <term>
/// An opaque data structure object from the service provider associated with socket s. This object stores the current configuration
/// information of the service provider. The exact format of this data structure is service provider specific.
/// </term>
/// </item>
/// </list>
/// <para>The following table of value for the optname parameter are valid when the level parameter is set to <c>IPPROTO_TCP</c>.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>TCP_NODELAY</term>
/// <term>BOOL</term>
/// <term>Disables the Nagle algorithm for send coalescing.</term>
/// </item>
/// </list>
/// <para>The following table of value for the optname parameter are valid when the level parameter is set to <c>NSPROTO_IPX</c>.</para>
/// <para><c>Note</c> Windows NT supports all IPX options. Windows Me, Windows 98, and Windows 95 support only the following options:</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>IPX_PTYPE</term>
/// <term>int</term>
/// <term>Retrieves the IPX packet type.</term>
/// </item>
/// <item>
/// <term>IPX_FILTERPTYPE</term>
/// <term>int</term>
/// <term>Retrieves the receive filter packet type</term>
/// </item>
/// <item>
/// <term>IPX_DSTYPE</term>
/// <term>int</term>
/// <term>Obtains the value of the data stream field in the SPX header on every packet sent.</term>
/// </item>
/// <item>
/// <term>IPX_EXTENDED_ADDRESS</term>
/// <term>BOOL</term>
/// <term>Finds out whether extended addressing is enabled.</term>
/// </item>
/// <item>
/// <term>IPX_RECVHDR</term>
/// <term>BOOL</term>
/// <term>Finds out whether the protocol header is sent up on all receive headers.</term>
/// </item>
/// <item>
/// <term>IPX_MAXSIZE</term>
/// <term>int</term>
/// <term>Obtains the maximum data size that can be sent.</term>
/// </item>
/// <item>
/// <term>IPX_ADDRESS</term>
/// <term>IPX_ADDRESS_DATA structure</term>
/// <term>
/// Obtains information about a specific adapter to which IPX is bound. Adapter numbering is base zero. The adapternum member is
/// filled in upon return.
/// </term>
/// </item>
/// <item>
/// <term>IPX_GETNETINFO</term>
/// <term>IPX_NETNUM_DATA structure</term>
/// <term>Obtains information about a specific IPX network number. If not available in the cache, uses RIP to obtain information.</term>
/// </item>
/// <item>
/// <term>IPX_GETNETINFO_NORIP</term>
/// <term>IPX_NETNUM_DATA structure</term>
/// <term>
/// Obtains information about a specific IPX network number. If not available in the cache, will not use RIP to obtain information,
/// and returns error.
/// </term>
/// </item>
/// <item>
/// <term>IPX_SPXGETCONNECTIONSTATUS</term>
/// <term>IPX_SPXCONNSTATUS_DATA structure</term>
/// <term>Retrieves information about a connected SPX socket.</term>
/// </item>
/// <item>
/// <term>IPX_ADDRESS_NOTIFY</term>
/// <term>IPX_ADDRESS_DATA structure</term>
/// <term>Retrieves status notification when changes occur on an adapter to which IPX is bound.</term>
/// </item>
/// <item>
/// <term>IPX_MAX_ADAPTER_NUM</term>
/// <term>int</term>
/// <term>Retrieves maximum number of adapters present, numbered as base zero.</term>
/// </item>
/// <item>
/// <term>IPX_RERIPNETNUMBER</term>
/// <term>IPX_NETNUM_DATA structure</term>
/// <term>Similar to IPX_GETNETINFO, but forces IPX to use RIP for resolution, even if the network information is in the local cache.</term>
/// </item>
/// <item>
/// <term>IPX_IMMEDIATESPXACK</term>
/// <term>BOOL</term>
/// <term>
/// Directs SPX connections not to delay before sending an ACK. Applications without back-and-forth traffic should set this to TRUE
/// to increase performance.
/// </term>
/// </item>
/// <item>
/// <term>TCP_MAXSEG</term>
/// <term>int</term>
/// <term>Receives TCP maximum-segment size. Supported in Windows 10 and newer versions.</term>
/// </item>
/// </list>
/// <para>
/// The following table lists value for the optname that represent BSD socket options that are not supported by the
/// <c>getsockopt</c> function.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>SO_RCVLOWAT</term>
/// <term>int</term>
/// <term>Receives low watermark.</term>
/// </item>
/// <item>
/// <term>SO_RCVTIMEO</term>
/// <term>int</term>
/// <term>Receives time-out.</term>
/// </item>
/// <item>
/// <term>SO_SNDLOWAT</term>
/// <term>int</term>
/// <term>Sends low watermark.</term>
/// </item>
/// <item>
/// <term>SO_SNDTIMEO</term>
/// <term>int</term>
/// <term>Sends time-out.</term>
/// </item>
/// <item>
/// <term>TCP_MAXSEG</term>
/// <term>int</term>
/// <term>Receives TCP maximum-segment size. Not supported in versions before Windows 10.</term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When using the recv function, if no data arrives during the period specified in SO_RCVTIMEO, the <c>recv</c>
/// function completes. In Windows versions prior to Windows 2000, any data received subsequently fails with WSAETIMEDOUT. In
/// Windows 2000 and later, if no data arrives within the period specified in SO_RCVTIMEO, the <c>recv</c> function returns
/// WSAETIMEDOUT, and if data is received, <c>recv</c> returns SUCCESS.
/// </para>
/// <para>
/// Calling <c>getsockopt</c> with an unsupported option will result in an error code of WSAENOPROTOOPT being returned from WSAGetLastError.
/// </para>
/// <para>
/// More detailed information on some of the socket options for the optname parameter supported by the <c>getsockopt</c> function
/// are listed below.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>getsockopt</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following code sample demonstrates the use of the <c>getsockopt</c> function.</para>
/// <para>Notes for IrDA Sockets</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>
/// Windows returns WSAENETDOWN to indicate the underlying transceiver driver failed to initialize with the IrDA protocol stack.
/// </term>
/// </item>
/// <item>
/// <term>IrDA supports several special socket options:</term>
/// </item>
/// </list>
/// <para>
/// Before an IrDA socket connection can be initiated, a device address must be obtained by performing a
/// <c>getsockopt</c>(,,IRLMP_ENUMDEVICES,,) function call, which returns a list of all available IrDA devices. A device address
/// returned from the function call is copied into a SOCKADDR_IRDA structure, which in turn is used by a subsequent call to the
/// connect function call.
/// </para>
/// <para>Discovery can be performed in two ways:</para>
/// <list type="number">
/// <item>
/// <term>
/// First, performing a getsockopt function call with the IRLMP_ENUMDEVICES option causes a single discovery to be run on each idle
/// adapter. The list of discovered devices and cached devices (on active adapters) is returned immediately.
/// </term>
/// </item>
/// <item>
/// <term>
/// The second approach to performing discovery of IrDA device addresses is to perform a lazy discovery; in this approach, the
/// application is not notified until the discovered devices list changes from the last discovery run by the stack.
/// </term>
/// </item>
/// </list>
/// <para>
/// The <c>DEVICELIST</c> structure shown in the Type column in the previous table is an extendible array of device descriptions.
/// IrDA fills in as many device descriptions as can fit in the specified buffer. The device description consists of a device
/// identifier necessary to form a sockaddr_irda structure, and a displayable string describing the device.
/// </para>
/// <para>
/// The <c>IAS_QUERY</c> structure shown in the Type column in the previous table is used to retrieve a single attribute of a single
/// class from a peer device's IAS database. The application specifies the device and class to query and the attribute and attribute
/// type. Note that the device would have been obtained previously by a call to <c>getsockopt</c>(IRLMP_ENUMDEVICES). It is expected
/// that the application allocates a buffer, of the necessary size, for the returned parameters.
/// </para>
/// <para>Many level socket options are not meaningful to IrDA; only SO_LINGER and SO_DONTLINGER are specifically supported.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-getsockopt int getsockopt( SOCKET s, int level, int
// optname, char *optval, int *optlen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("winsock.h", MSDNShortId = "25bc511d-7a9f-41c1-8983-1af1e3f8bf2d")]
public static extern WSRESULT getsockopt(SOCKET s, int level, int optname, [Optional] IntPtr optval, ref int optlen);
/// <summary>The <c>htonl</c> function converts a <c>u_long</c> from host to TCP/IP network byte order (which is big-endian).</summary>
/// <param name="hostlong">A 32-bit number in host byte order.</param>
/// <returns>The <c>htonl</c> function returns the value in TCP/IP's network byte order.</returns>
/// <remarks>
/// <para>
/// The <c>htonl</c> function takes a 32-bit number in host byte order and returns a 32-bit number in the network byte order used in
/// TCP/IP networks (the AF_INET or AF_INET6 address family).
/// </para>
/// <para>
/// The <c>htonl</c> function can be used to convert an IPv4 address in host byte order to the IPv4 address in network byte order.
/// This function does not do any checking to determine if the hostlong parameter is a valid IPv4 address.
/// </para>
/// <para>
/// The <c>htonl</c> function does not require that the Winsock DLL has previously been loaded with a successful call to the
/// WSAStartup function.
/// </para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-htonl u_long htonl( u_long hostlong );
[DllImport(Lib.Ws2_32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "e3a18c5e-7efb-43d9-9abc-9d573bbb1923")]
public static extern uint htonl(uint hostlong);
/// <summary>The <c>htons</c> function converts a <c>u_short</c> from host to TCP/IP network byte order (which is big-endian).</summary>
/// <param name="hostshort">A 16-bit number in host byte order.</param>
/// <returns>The <c>htons</c> function returns the value in TCP/IP network byte order.</returns>
/// <remarks>
/// <para>
/// The <c>htons</c> function takes a 16-bit number in host byte order and returns a 16-bit number in network byte order used in
/// TCP/IP networks (the AF_INET or AF_INET6 address family).
/// </para>
/// <para>
/// The <c>htons</c> function can be used to convert an IP port number in host byte order to the IP port number in network byte order.
/// </para>
/// <para>
/// The <c>htons</c> function does not require that the Winsock DLL has previously been loaded with a successful call to the
/// WSAStartup function.
/// </para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-htons u_short htons( u_short hostshort );
[DllImport(Lib.Ws2_32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "3dae2655-2b3c-41d9-9650-125ac393d64a")]
public static extern ushort htons(ushort hostshort);
/// <summary>
/// The <c>inet_addr</c> function converts a string containing an IPv4 dotted-decimal address into a proper address for the IN_ADDR structure.
/// </summary>
/// <param name="cp">TBD</param>
/// <returns>
/// <para>
/// If no error occurs, the <c>inet_addr</c> function returns an unsigned long value containing a suitable binary representation of
/// the Internet address given.
/// </para>
/// <para>
/// If the string in the cp parameter does not contain a legitimate Internet address, for example if a portion of an "a.b.c.d"
/// address exceeds 255, then <c>inet_addr</c> returns the value <c>INADDR_NONE</c>.
/// </para>
/// <para>
/// On Windows Server 2003and later if the string in the cp parameter is an empty string, then <c>inet_addr</c> returns the value
/// <c>INADDR_NONE</c>. If <c>NULL</c> is passed in the cp parameter, then <c>inet_addr</c> returns the value <c>INADDR_NONE</c>.
/// </para>
/// <para>
/// On Windows XPand earlier if the string in the cp parameter is an empty string, then <c>inet_addr</c> returns the value
/// <c>INADDR_ANY</c>. If <c>NULL</c> is passed in the cp parameter, then <c>inet_addr</c> returns the value <c>INADDR_NONE</c>.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The <c>inet_addr</c> function interprets the character string specified by the cp parameter. This string represents a numeric
/// Internet address expressed in the Internet standard ".'' notation. The value returned is a number suitable for use as an
/// Internet address. All Internet addresses are returned in IP's network order (bytes ordered from left to right). If you pass in "
/// " (a space) to the <c>inet_addr</c> function, <c>inet_addr</c> returns zero.
/// </para>
/// <para>
/// On Windows Vista and later, the RtlIpv4StringToAddress function can be used to convert a string representation of an IPv4
/// address to a binary IPv4 address represented as an IN_ADDR structure. On Windows Vista and later, the RtlIpv6StringToAddress
/// function can be used to convert a string representation of an IPv6 address to a binary IPv6 address represented as an
/// <c>IN6_ADDR</c> structure.
/// </para>
/// <para>Internet Addresses</para>
/// <para>Values specified using the ".'' notation take one of the following forms:</para>
/// <para>a.b.c.d a.b.c a.b a</para>
/// <para>
/// When four parts are specified, each is interpreted as a byte of data and assigned, from left to right, to the 4 bytes of an
/// Internet address. When an Internet address is viewed as a 32-bit integer quantity on the Intel architecture, the bytes referred
/// to above appear as "d.c.b.a''. That is, the bytes on an Intel processor are ordered from right to left.
/// </para>
/// <para>
/// The parts that make up an address in "." notation can be decimal, octal or hexadecimal as specified in the C language. Numbers
/// that start with "0x" or "0X" imply hexadecimal. Numbers that start with "0" imply octal. All other numbers are interpreted as decimal.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Internet address value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>"4.3.2.16"</term>
/// <term>Decimal</term>
/// </item>
/// <item>
/// <term>"004.003.002.020"</term>
/// <term>Octal</term>
/// </item>
/// <item>
/// <term>"0x4.0x3.0x2.0x10"</term>
/// <term>Hexadecimal</term>
/// </item>
/// <item>
/// <term>"4.003.002.0x10"</term>
/// <term>Mix</term>
/// </item>
/// </list>
/// <para>
/// The <c>inet_addr</c> function supports the decimal, octal, hexadecimal, and mixed notations for the string passed in the cp parameter.
/// </para>
/// <para>
/// <c>Note</c> The following notations are only used by Berkeley software, and nowhere else on the Internet. For compatibility with
/// Berkeley software, the <c>inet_addr</c> function also supports the additional notations specified below.
/// </para>
/// <para>
/// When a three-part address is specified, the last part is interpreted as a 16-bit quantity and placed in the right-most 2 bytes
/// of the network address. This makes the three-part address format convenient for specifying Class B network addresses as "128.net.host''
/// </para>
/// <para>
/// When a two-part address is specified, the last part is interpreted as a 24-bit quantity and placed in the right-most 3 bytes of
/// the network address. This makes the two-part address format convenient for specifying Class A network addresses as "net.host''.
/// </para>
/// <para>When only one part is given, the value is stored directly in the network address without any byte rearrangement.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// <para>Examples</para>
/// <para>The following code example shows how to use the <c>inet_addr</c> function.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-inet_addr unsigned long WSAAPI inet_addr( const char *cp );
[DllImport(Lib.Ws2_32, SetLastError = false, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("winsock2.h", MSDNShortId = "7d6df658-9d83-45c7-97e7-b2a016a73847")]
public static extern uint inet_addr(string cp);
/// <summary>
/// <para>
/// The <c>inet_ntoa</c> function converts an (Ipv4) Internet network address into an ASCII string in Internet standard
/// dotted-decimal format.
/// </para>
/// </summary>
/// <param name="a">An Internet address structure</param>
/// <returns>
/// <para>
/// If no error occurs, inet_ntoa returns a character pointer to a static buffer containing the text address in standard ".''
/// notation. Otherwise, it returns NULL.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The <c>inet_ntoa</c> function takes an Internet address structure specified by the in parameter and returns a
/// <c>NULL</c>-terminated ASCII string that represents the address in "." (dot) notation as in "192.168.16.0", an example of an
/// IPv4 address in dotted-decimal notation. The string returned by <c>inet_ntoa</c> resides in memory that is allocated by Windows
/// Sockets. The application should not make any assumptions about the way in which the memory is allocated. The string returned is
/// guaranteed to be valid only until the next Windows Sockets function call is made within the same thread. Therefore, the data
/// should be copied before another Windows Sockets call is made.
/// </para>
/// <para>
/// The WSAAddressToString function can be used to convert a sockaddr structure containing an IPv4 address to a string
/// representation of an IPv4 address in Internet standard dotted-decimal notation. The advantage of the <c>WSAAddressToString</c>
/// function is that it supports both IPv4 and IPv6 addresses. Another advantage of the <c>WSAAddressToString</c> function is that
/// there are both ASCII and Unicode versions of this function.
/// </para>
/// <para>
/// On Windows Vista and later, the RtlIpv4AddressToString function can be used to convert an IPv4 address represented as an IN_ADDR
/// structure to a string representation of an IPv4 address in Internet standard dotted-decimal notation. On Windows Vista and
/// later, the RtlIpv6AddressToString function can be used to convert an IPv6 address represented as an <c>IN6_ADDR</c> structure to
/// a string representation of an IPv6 address.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/wsipv6ok/nf-wsipv6ok-inet_ntoa void inet_ntoa( a );
[DllImport(Lib.Ws2_32, SetLastError = false, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("wsipv6ok.h", MSDNShortId = "01cd32e7-a01d-40e8-afb5-69223d643a0e")]
public static extern StrPtrAnsi inet_ntoa(IN_ADDR a);
/// <summary>The <c>ioctlsocket</c> function controls the I/O mode of a socket.</summary>
/// <param name="s">A descriptor identifying a socket.</param>
/// <param name="cmd">A command to perform on the socket s.</param>
/// <param name="argp">A pointer to a parameter for cmd.</param>
/// <returns>
/// <para>
/// Upon successful completion, the <c>ioctlsocket</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific
/// error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor s is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The argp parameter is not a valid part of the user address space.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>ioctlsocket</c> function can be used on any socket in any state. It is used to set or retrieve some operating parameters
/// associated with the socket, independent of the protocol and communications subsystem. Here are the supported commands to use in
/// the cmd parameter and their semantics:
/// </para>
/// <para>
/// The WSAIoctl function is used to set or retrieve operating parameters associated with the socket, the transport protocol, or the
/// communications subsystem.
/// </para>
/// <para>
/// The <c>WSAIoctl</c> function is more powerful than the <c>ioctlsocket</c> function and supports a large number of possible
/// values for the operating parameters to set or retrieve.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>ioctlsocket</c> function.</para>
/// <para>Compatibility</para>
/// <para>
/// This <c>ioctlsocket</c> function performs only a subset of functions on a socket when compared to the <c>ioctl</c> function
/// found in Berkeley sockets. The <c>ioctlsocket</c> function has no command parameter equivalent to the FIOASYNC of <c>ioctl</c>,
/// and SIOCATMARK is the only socket-level command that is supported by <c>ioctlsocket</c>.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-ioctlsocket int ioctlsocket( SOCKET s, long cmd, u_long
// *argp );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "048fcb8d-acd3-4917-a997-dd133db399f8")]
public static extern WSRESULT ioctlsocket(SOCKET s, uint cmd, IntPtr argp);
/// <summary>The <c>listen</c> function places a socket in a state in which it is listening for an incoming connection.</summary>
/// <param name="s">A descriptor identifying a bound, unconnected socket.</param>
/// <param name="backlog">
/// <para>
/// The maximum length of the queue of pending connections. If set to <c>SOMAXCONN</c>, the underlying service provider responsible
/// for socket s will set the backlog to a maximum reasonable value. If set to <c>SOMAXCONN_HINT(N)</c> (where N is a number), the
/// backlog value will be N, adjusted to be within the range (200, 65535). Note that <c>SOMAXCONN_HINT</c> can be used to set the
/// backlog to a larger value than possible with SOMAXCONN.
/// </para>
/// <para>
/// <c>SOMAXCONN_HINT</c> is only supported by the Microsoft TCP/IP service provider. There is no standard provision to obtain the
/// actual backlog value.
/// </para>
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>listen</c> returns zero. Otherwise, a value of <c>SOCKET_ERROR</c> is returned, and a specific error code
/// can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEADDRINUSE</term>
/// <term>
/// The socket's local address is already in use and the socket was not marked to allow address reuse with SO_REUSEADDR. This error
/// usually occurs during execution of the bind function, but could be delayed until this function if the bind was to a partially
/// wildcard address (involving ADDR_ANY) and if a specific address needs to be committed at the time of this function.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The socket has not been bound with bind.</term>
/// </item>
/// <item>
/// <term>WSAEISCONN</term>
/// <term>The socket is already connected.</term>
/// </item>
/// <item>
/// <term>WSAEMFILE</term>
/// <term>No more socket descriptors are available.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>The referenced socket is not of a type that supports the listen operation.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// To accept connections, a socket is first created with the socket function and bound to a local address with the bind function. A
/// backlog for incoming connections is specified with <c>listen</c>, and then the connections are accepted with the accept
/// function. Sockets that are connection oriented, those of type <c>SOCK_STREAM</c> for example, are used with <c>listen</c>. The
/// socket s is put into passive mode where incoming connection requests are acknowledged and queued pending acceptance by the process.
/// </para>
/// <para>
/// A value for the backlog of <c>SOMAXCONN</c> is a special constant that instructs the underlying service provider responsible for
/// socket s to set the length of the queue of pending connections to a maximum reasonable value.
/// </para>
/// <para>On Windows Sockets 2, this maximum value defaults to a large value (typically several hundred or more).</para>
/// <para>
/// When calling the <c>listen</c> function in a Bluetooth application, it is strongly recommended that a much lower value be used
/// for the backlog parameter (typically 2 to 4), since only a few client connections are accepted. This reduces the system
/// resources that are allocated for use by the listening socket. This same recommendation applies to other network applications
/// that expect only a few client connections.
/// </para>
/// <para>
/// The <c>listen</c> function is typically used by servers that can have more than one connection request at a time. If a
/// connection request arrives and the queue is full, the client will receive an error with an indication of WSAECONNREFUSED.
/// </para>
/// <para>
/// If there are no available socket descriptors, <c>listen</c> attempts to continue to function. If descriptors become available, a
/// later call to <c>listen</c> or accept will refill the queue to the current or most recent value specified for the backlog
/// parameter, if possible, and resume listening for incoming connections.
/// </para>
/// <para>
/// If the <c>listen</c> function is called on an already listening socket, it will return success without changing the value for
/// the backlog parameter. Setting the backlog parameter to 0 in a subsequent call to <c>listen</c> on a listening socket is not
/// considered a proper reset, especially if there are connections on the socket.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>listen</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>listen</c> function.</para>
/// <para>Example Code</para>
/// <para>For another example that uses the <c>listen</c> function, see Getting Started With Winsock.</para>
/// <para>Notes for IrDA Sockets</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// </list>
/// <para>Compatibility</para>
/// <para>
/// The backlog parameter is limited (silently) to a reasonable value as determined by the underlying service provider. Illegal
/// values are replaced by the nearest legal value. There is no standard provision to find out the actual backlog value.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-listen int WSAAPI listen( SOCKET s, int backlog );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "1233feeb-a8c1-49ac-ab34-82af224ecf00")]
public static extern WSRESULT listen(SOCKET s, int backlog);
/// <summary>
/// The <c>ntohl</c> function converts a <c>u_long</c> from TCP/IP network order to host byte order (which is little-endian on Intel processors).
/// </summary>
/// <param name="netlong">A 32-bit number in TCP/IP network byte order.</param>
/// <returns>
/// The <c>ntohl</c> function returns the value supplied in the netlong parameter with the byte order reversed. If netlong is
/// already in host byte order, then this function will reverse it. It is up to the application to determine if the byte order must
/// be reversed.
/// </returns>
/// <remarks>
/// <para>
/// The <c>ntohl</c> function takes a 32-bit number in TCP/IP network byte order (the AF_INET or AF_INET6 address family) and
/// returns a 32-bit number in host byte order.
/// </para>
/// <para>
/// The <c>ntohl</c> function can be used to convert an IPv4 address in network byte order to the IPv4 address in host byte order.
/// This function does not do any checking to determine if the netlong parameter is a valid IPv4 address.
/// </para>
/// <para>
/// The <c>ntohl</c> function does not require that the Winsock DLL has previously been loaded with a successful call to the
/// WSAStartup function.
/// </para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-ntohl u_long ntohl( u_long netlong );
[DllImport(Lib.Ws2_32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "04673bef-22c6-424f-a5ae-689fb648b54e")]
public static extern uint ntohl(uint netlong);
/// <summary>
/// The <c>ntohs</c> function converts a <c>u_short</c> from TCP/IP network byte order to host byte order (which is little-endian on
/// Intel processors).
/// </summary>
/// <param name="netshort">A 16-bit number in TCP/IP network byte order.</param>
/// <returns>
/// The <c>ntohs</c> function returns the value in host byte order. If the netshort parameter is already in host byte order, then
/// this function will reverse it. It is up to the application to determine if the byte order must be reversed.
/// </returns>
/// <remarks>
/// <para>
/// The <c>ntohs</c> function takes a 16-bit number in TCP/IP network byte order (the AF_INET or AF_INET6 address family) and
/// returns a 16-bit number in host byte order.
/// </para>
/// <para>
/// The <c>ntohs</c> function can be used to convert an IP port number in network byte order to the IP port number in host byte order.
/// </para>
/// <para>
/// The <c>ntohs</c> function does not require that the Winsock DLL has previously been loaded with a successful call to the
/// WSAStartup function.
/// </para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-ntohs u_short ntohs( u_short netshort );
[DllImport(Lib.Ws2_32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "9946df13-3b40-4bcb-91ca-10684b3fc9a5")]
public static extern ushort ntohs(ushort netshort);
/// <summary>The <c>recv</c> function receives data from a connected socket or a bound connectionless socket.</summary>
/// <param name="s">The descriptor that identifies a connected socket.</param>
/// <param name="buf">A pointer to the buffer to receive the incoming data.</param>
/// <param name="len">The length, in bytes, of the buffer pointed to by the buf parameter.</param>
/// <param name="flags">
/// A set of flags that influences the behavior of this function. See remarks below. See the Remarks section for details on the
/// possible value for this parameter.
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>recv</c> returns the number of bytes received and the buffer pointed to by the buf parameter will contain
/// this data received. If the connection has been gracefully closed, the return value is zero.
/// </para>
/// <para>Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.</para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The buf parameter is not completely contained in a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>The (blocking) call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>
/// For a connection-oriented socket, this error indicates that the connection has been broken due to keep-alive activity that
/// detected a failure while the operation was in progress. For a datagram socket, this error indicates that the time to live has expired.
/// </term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only send operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to receive on a socket after shutdown has been invoked with how set to
/// SD_RECEIVE or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the receive operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The message was too large to fit into the specified buffer and was truncated.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with
/// SO_OOBINLINE enabled or (for byte stream sockets only) len was zero or negative.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>The connection has been dropped because of a network failure or because the peer system failed to respond.</term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket as
/// it is no longer usable. On a UDP-datagram socket, this error would indicate that a previous send operation resulted in an ICMP
/// "Port Unreachable" message.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>recv</c> function is used to read incoming data on connection-oriented sockets, or connectionless sockets. When using a
/// connection-oriented protocol, the sockets must be connected before calling <c>recv</c>. When using a connectionless protocol,
/// the sockets must be bound before calling <c>recv</c>.
/// </para>
/// <para>
/// The local address of the socket must be known. For server applications, use an explicit bind function or an implicit accept or
/// WSAAccept function. Explicit binding is discouraged for client applications. For client applications, the socket can become
/// bound implicitly to a local address using connect, WSAConnect, sendto, WSASendTo, or WSAJoinLeaf.
/// </para>
/// <para>
/// For connected or connectionless sockets, the <c>recv</c> function restricts the addresses from which received messages are
/// accepted. The function only returns messages from the remote address specified in the connection. Messages from other addresses
/// are (silently) discarded.
/// </para>
/// <para>
/// For connection-oriented sockets (type SOCK_STREAM for example), calling <c>recv</c> will return as much data as is currently
/// available—up to the size of the buffer specified. If the socket has been configured for in-line reception of OOB data (socket
/// option SO_OOBINLINE) and OOB data is yet unread, only OOB data will be returned. The application can use the ioctlsocket or
/// WSAIoctl <c>SIOCATMARK</c> command to determine whether any more OOB data remains to be read.
/// </para>
/// <para>
/// For connectionless sockets (type SOCK_DGRAM or other message-oriented sockets), data is extracted from the first enqueued
/// datagram (message) from the destination address specified by the connect function.
/// </para>
/// <para>
/// If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and
/// <c>recv</c> generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost; for reliable
/// protocols, the data is retained by the service provider until it is successfully read by calling <c>recv</c> with a large enough buffer.
/// </para>
/// <para>
/// If no incoming data is available at the socket, the <c>recv</c> call blocks and waits for data to arrive according to the
/// blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking. In this case, a value of
/// SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select, WSAAsyncSelect, or WSAEventSelect functions can
/// be used to determine when more data arrives.
/// </para>
/// <para>
/// If the socket is connection oriented and the remote side has shut down the connection gracefully, and all data has been
/// received, a <c>recv</c> will complete immediately with zero bytes received. If the connection has been reset, a <c>recv</c> will
/// fail with the error WSAECONNRESET.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the
/// associated socket. The semantics of this function are determined by the socket options and the flags parameter. The possible
/// value of flags parameter is constructed by using the bitwise OR operator with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_PEEK</term>
/// <term>
/// Peeks at the incoming data. The data is copied into the buffer, but is not removed from the input queue. The function
/// subsequently returns the amount of data that can be read in a single call to the recv (or recvfrom) function, which may not be
/// the same as the total amount of data queued on the socket. The amount of data that can actually be read in a single call to the
/// recv (or recvfrom) function is limited to the data size written in the send or sendto function call.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Processes Out Of Band (OOB) data.</term>
/// </item>
/// <item>
/// <term>MSG_WAITALL</term>
/// <term>
/// The receive request will complete only when one of the following events occurs:Note that if the underlying transport does not
/// support MSG_WAITALL, or if the socket is in a non-blocking mode, then this call will fail with WSAEOPNOTSUPP. Also, if
/// MSG_WAITALL is specified along with MSG_OOB, MSG_PEEK, or MSG_PARTIAL, then this call will fail with WSAEOPNOTSUPP. This flag is
/// not supported on datagram sockets or message-oriented sockets.
/// </term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>recv</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following code example shows the use of the <c>recv</c> function.</para>
/// <para>Example Code</para>
/// <para>For more information, and another example of the <c>recv</c> function, see Getting Started With Winsock.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv int recv( SOCKET s, char *buf, int len, int flags );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "8c247cd3-479f-45d0-a038-a24e80cc7c73")]
public static extern int recv(SOCKET s, IntPtr buf, int len, MsgFlags flags);
/// <summary>The <c>recv</c> function receives data from a connected socket or a bound connectionless socket.</summary>
/// <param name="s">The descriptor that identifies a connected socket.</param>
/// <param name="buf">A pointer to the buffer to receive the incoming data.</param>
/// <param name="len">The length, in bytes, of the buffer pointed to by the buf parameter.</param>
/// <param name="flags">
/// A set of flags that influences the behavior of this function. See remarks below. See the Remarks section for details on the
/// possible value for this parameter.
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>recv</c> returns the number of bytes received and the buffer pointed to by the buf parameter will contain
/// this data received. If the connection has been gracefully closed, the return value is zero.
/// </para>
/// <para>Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.</para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The buf parameter is not completely contained in a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>The (blocking) call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>
/// For a connection-oriented socket, this error indicates that the connection has been broken due to keep-alive activity that
/// detected a failure while the operation was in progress. For a datagram socket, this error indicates that the time to live has expired.
/// </term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only send operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to receive on a socket after shutdown has been invoked with how set to
/// SD_RECEIVE or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the receive operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The message was too large to fit into the specified buffer and was truncated.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with
/// SO_OOBINLINE enabled or (for byte stream sockets only) len was zero or negative.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>The connection has been dropped because of a network failure or because the peer system failed to respond.</term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket as
/// it is no longer usable. On a UDP-datagram socket, this error would indicate that a previous send operation resulted in an ICMP
/// "Port Unreachable" message.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>recv</c> function is used to read incoming data on connection-oriented sockets, or connectionless sockets. When using a
/// connection-oriented protocol, the sockets must be connected before calling <c>recv</c>. When using a connectionless protocol,
/// the sockets must be bound before calling <c>recv</c>.
/// </para>
/// <para>
/// The local address of the socket must be known. For server applications, use an explicit bind function or an implicit accept or
/// WSAAccept function. Explicit binding is discouraged for client applications. For client applications, the socket can become
/// bound implicitly to a local address using connect, WSAConnect, sendto, WSASendTo, or WSAJoinLeaf.
/// </para>
/// <para>
/// For connected or connectionless sockets, the <c>recv</c> function restricts the addresses from which received messages are
/// accepted. The function only returns messages from the remote address specified in the connection. Messages from other addresses
/// are (silently) discarded.
/// </para>
/// <para>
/// For connection-oriented sockets (type SOCK_STREAM for example), calling <c>recv</c> will return as much data as is currently
/// available—up to the size of the buffer specified. If the socket has been configured for in-line reception of OOB data (socket
/// option SO_OOBINLINE) and OOB data is yet unread, only OOB data will be returned. The application can use the ioctlsocket or
/// WSAIoctl <c>SIOCATMARK</c> command to determine whether any more OOB data remains to be read.
/// </para>
/// <para>
/// For connectionless sockets (type SOCK_DGRAM or other message-oriented sockets), data is extracted from the first enqueued
/// datagram (message) from the destination address specified by the connect function.
/// </para>
/// <para>
/// If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and
/// <c>recv</c> generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost; for reliable
/// protocols, the data is retained by the service provider until it is successfully read by calling <c>recv</c> with a large enough buffer.
/// </para>
/// <para>
/// If no incoming data is available at the socket, the <c>recv</c> call blocks and waits for data to arrive according to the
/// blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking. In this case, a value of
/// SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select, WSAAsyncSelect, or WSAEventSelect functions can
/// be used to determine when more data arrives.
/// </para>
/// <para>
/// If the socket is connection oriented and the remote side has shut down the connection gracefully, and all data has been
/// received, a <c>recv</c> will complete immediately with zero bytes received. If the connection has been reset, a <c>recv</c> will
/// fail with the error WSAECONNRESET.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the
/// associated socket. The semantics of this function are determined by the socket options and the flags parameter. The possible
/// value of flags parameter is constructed by using the bitwise OR operator with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_PEEK</term>
/// <term>
/// Peeks at the incoming data. The data is copied into the buffer, but is not removed from the input queue. The function
/// subsequently returns the amount of data that can be read in a single call to the recv (or recvfrom) function, which may not be
/// the same as the total amount of data queued on the socket. The amount of data that can actually be read in a single call to the
/// recv (or recvfrom) function is limited to the data size written in the send or sendto function call.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Processes Out Of Band (OOB) data.</term>
/// </item>
/// <item>
/// <term>MSG_WAITALL</term>
/// <term>
/// The receive request will complete only when one of the following events occurs:Note that if the underlying transport does not
/// support MSG_WAITALL, or if the socket is in a non-blocking mode, then this call will fail with WSAEOPNOTSUPP. Also, if
/// MSG_WAITALL is specified along with MSG_OOB, MSG_PEEK, or MSG_PARTIAL, then this call will fail with WSAEOPNOTSUPP. This flag is
/// not supported on datagram sockets or message-oriented sockets.
/// </term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>recv</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following code example shows the use of the <c>recv</c> function.</para>
/// <para>Example Code</para>
/// <para>For more information, and another example of the <c>recv</c> function, see Getting Started With Winsock.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv int recv( SOCKET s, char *buf, int len, int flags );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "8c247cd3-479f-45d0-a038-a24e80cc7c73")]
public static extern int recv(SOCKET s, byte[] buf, int len, MsgFlags flags);
/// <summary>The <c>recvfrom</c> function receives a datagram and stores the source address.</summary>
/// <param name="s">A descriptor identifying a bound socket.</param>
/// <param name="buf">A buffer for the incoming data.</param>
/// <param name="len">The length, in bytes, of the buffer pointed to by the buf parameter.</param>
/// <param name="flags">
/// A set of options that modify the behavior of the function call beyond the options specified for the associated socket. See the
/// Remarks below for more details.
/// </param>
/// <param name="from">An optional pointer to a buffer in a sockaddr structure that will hold the source address upon return.</param>
/// <param name="fromlen">An optional pointer to the size, in bytes, of the buffer pointed to by the from parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>recvfrom</c> returns the number of bytes received. If the connection has been gracefully closed, the
/// return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The buffer pointed to by the buf or from parameters are not in the user address space, or the fromlen parameter is too small to
/// accommodate the source address of the peer address.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>The (blocking) call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with
/// SO_OOBINLINE enabled, or (for byte stream-style sockets only) len was zero or negative.
/// </term>
/// </item>
/// <item>
/// <term>WSAEISCONN</term>
/// <term>
/// The socket is connected. This function is not permitted with a connected socket, whether the socket is connection oriented or connectionless.
/// </term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>For a datagram socket, this error indicates that the time to live has expired.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor in the s parameter is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only send operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to recvfrom on a socket after shutdown has been invoked with how set to
/// SD_RECEIVE or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the recvfrom operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The message was too large to fit into the buffer pointed to by the buf parameter and was truncated.</term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>
/// The connection has been dropped, because of a network failure or because the system on the other end went down without notice.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket; it
/// is no longer usable. On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port
/// Unreachable message.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>recvfrom</c> function reads incoming data on both connected and unconnected sockets and captures the address from which
/// the data was sent. This function is typically used with connectionless sockets. The local address of the socket must be known.
/// For server applications, this is usually done explicitly through bind. Explicit binding is discouraged for client applications.
/// For client applications using this function, the socket can become bound implicitly to a local address through sendto,
/// WSASendTo, or WSAJoinLeaf.
/// </para>
/// <para>
/// For stream-oriented sockets such as those of type SOCK_STREAM, a call to <c>recvfrom</c> returns as much information as is
/// currently available—up to the size of the buffer specified. If the socket has been configured for inline reception of OOB data
/// (socket option SO_OOBINLINE) and OOB data is yet unread, only OOB data will be returned. The application can use the ioctlsocket
/// or WSAIoctl <c>SIOCATMARK</c> command to determine whether any more OOB data remains to be read. The from and fromlen parameters
/// are ignored for connection-oriented sockets.
/// </para>
/// <para>
/// For message-oriented sockets, data is extracted from the first enqueued message, up to the size of the buffer specified. If the
/// datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and
/// <c>recvfrom</c> generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost. For UDP if
/// the packet received contains no data (empty), the return value from the <c>recvfrom</c> function function is zero.
/// </para>
/// <para>
/// If the from parameter is nonzero and the socket is not connection oriented, (type SOCK_DGRAM for example), the network address
/// of the peer that sent the data is copied to the corresponding sockaddr structure. The value pointed to by fromlen is initialized
/// to the size of this structure and is modified, on return, to indicate the actual size of the address stored in the
/// <c>sockaddr</c> structure.
/// </para>
/// <para>
/// If no incoming data is available at the socket, the <c>recvfrom</c> function blocks and waits for data to arrive according to
/// the blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking. In this case, a value
/// of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select, WSAAsyncSelect, or WSAEventSelect can be used
/// to determine when more data arrives.
/// </para>
/// <para>
/// If the socket is connection oriented and the remote side has shut down the connection gracefully, the call to <c>recvfrom</c>
/// will complete immediately with zero bytes received. If the connection has been reset <c>recvfrom</c> will fail with the error WSAECONNRESET.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the
/// associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is
/// constructed by using the bitwise OR operator with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_PEEK</term>
/// <term>
/// Peeks at the incoming data. The data is copied into the buffer but is not removed from the input queue. The function
/// subsequently returns the amount of data that can be read in a single call to the recvfrom (or recv) function, which may not be
/// the same as the total amount of data queued on the socket. The amount of data that can actually be read in a single call to the
/// recvfrom (or recv) function is limited to the data size written in the send or sendto function call.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Processes Out Of Band (OOB) data.</term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>recvfrom</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>recvfrom</c> function.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recvfrom int recvfrom( SOCKET s, char *buf, int len, int
// flags, sockaddr *from, int *fromlen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "3e4282e0-3ed0-43e7-9b27-72ec36b9cfa1")]
public static extern int recvfrom(SOCKET s, IntPtr buf, int len, int flags, SOCKADDR from, ref int fromlen);
/// <summary>The <c>recvfrom</c> function receives a datagram and stores the source address.</summary>
/// <param name="s">A descriptor identifying a bound socket.</param>
/// <param name="buf">A buffer for the incoming data.</param>
/// <param name="len">The length, in bytes, of the buffer pointed to by the buf parameter.</param>
/// <param name="flags">
/// A set of options that modify the behavior of the function call beyond the options specified for the associated socket. See the
/// Remarks below for more details.
2021-07-20 09:54:12 -04:00
/// </param>
/// <param name="from">An optional pointer to a buffer in a sockaddr structure that will hold the source address upon return.</param>
/// <param name="fromlen">An optional pointer to the size, in bytes, of the buffer pointed to by the from parameter.</param>
2021-07-20 09:54:12 -04:00
/// <returns>
/// <para>
/// If no error occurs, <c>recvfrom</c> returns the number of bytes received. If the connection has been gracefully closed, the
/// return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
2021-07-20 09:54:12 -04:00
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
2021-07-20 09:54:12 -04:00
/// <term>WSAEFAULT</term>
/// <term>
/// The buffer pointed to by the buf or from parameters are not in the user address space, or the fromlen parameter is too small to
/// accommodate the source address of the peer address.
2021-07-20 09:54:12 -04:00
/// </term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>The (blocking) call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
2021-07-20 09:54:12 -04:00
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with
/// SO_OOBINLINE enabled, or (for byte stream-style sockets only) len was zero or negative.
/// </term>
2021-07-20 09:54:12 -04:00
/// </item>
/// <item>
/// <term>WSAEISCONN</term>
/// <term>
/// The socket is connected. This function is not permitted with a connected socket, whether the socket is connection oriented or connectionless.
/// </term>
2021-07-20 09:54:12 -04:00
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>For a datagram socket, this error indicates that the time to live has expired.</term>
2021-07-20 09:54:12 -04:00
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor in the s parameter is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only send operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to recvfrom on a socket after shutdown has been invoked with how set to
/// SD_RECEIVE or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the recvfrom operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The message was too large to fit into the buffer pointed to by the buf parameter and was truncated.</term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>
/// The connection has been dropped, because of a network failure or because the system on the other end went down without notice.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket; it
/// is no longer usable. On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port
/// Unreachable message.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>recvfrom</c> function reads incoming data on both connected and unconnected sockets and captures the address from which
/// the data was sent. This function is typically used with connectionless sockets. The local address of the socket must be known.
/// For server applications, this is usually done explicitly through bind. Explicit binding is discouraged for client applications.
/// For client applications using this function, the socket can become bound implicitly to a local address through sendto,
/// WSASendTo, or WSAJoinLeaf.
/// </para>
/// <para>
/// For stream-oriented sockets such as those of type SOCK_STREAM, a call to <c>recvfrom</c> returns as much information as is
/// currently available—up to the size of the buffer specified. If the socket has been configured for inline reception of OOB data
/// (socket option SO_OOBINLINE) and OOB data is yet unread, only OOB data will be returned. The application can use the ioctlsocket
/// or WSAIoctl <c>SIOCATMARK</c> command to determine whether any more OOB data remains to be read. The from and fromlen parameters
/// are ignored for connection-oriented sockets.
/// </para>
/// <para>
/// For message-oriented sockets, data is extracted from the first enqueued message, up to the size of the buffer specified. If the
/// datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and
/// <c>recvfrom</c> generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost. For UDP if
/// the packet received contains no data (empty), the return value from the <c>recvfrom</c> function function is zero.
/// </para>
/// <para>
/// If the from parameter is nonzero and the socket is not connection oriented, (type SOCK_DGRAM for example), the network address
/// of the peer that sent the data is copied to the corresponding sockaddr structure. The value pointed to by fromlen is initialized
/// to the size of this structure and is modified, on return, to indicate the actual size of the address stored in the
/// <c>sockaddr</c> structure.
/// </para>
/// <para>
/// If no incoming data is available at the socket, the <c>recvfrom</c> function blocks and waits for data to arrive according to
/// the blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking. In this case, a value
/// of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select, WSAAsyncSelect, or WSAEventSelect can be used
/// to determine when more data arrives.
/// </para>
/// <para>
/// If the socket is connection oriented and the remote side has shut down the connection gracefully, the call to <c>recvfrom</c>
/// will complete immediately with zero bytes received. If the connection has been reset <c>recvfrom</c> will fail with the error WSAECONNRESET.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the
/// associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is
/// constructed by using the bitwise OR operator with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_PEEK</term>
/// <term>
/// Peeks at the incoming data. The data is copied into the buffer but is not removed from the input queue. The function
/// subsequently returns the amount of data that can be read in a single call to the recvfrom (or recv) function, which may not be
/// the same as the total amount of data queued on the socket. The amount of data that can actually be read in a single call to the
/// recvfrom (or recv) function is limited to the data size written in the send or sendto function call.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Processes Out Of Band (OOB) data.</term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>recvfrom</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>recvfrom</c> function.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recvfrom int recvfrom( SOCKET s, char *buf, int len, int
// flags, sockaddr *from, int *fromlen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "3e4282e0-3ed0-43e7-9b27-72ec36b9cfa1")]
public static extern int recvfrom(SOCKET s, byte[] buf, int len, int flags, SOCKADDR from, ref int fromlen);
/// <summary>
/// The <c>select</c> function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O.
/// </summary>
/// <param name="nfds">Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.</param>
/// <param name="readfds">An optional pointer to a set of sockets to be checked for readability.</param>
/// <param name="writefds">An optional pointer to a set of sockets to be checked for writability.</param>
/// <param name="exceptfds">An optional pointer to a set of sockets to be checked for errors.</param>
/// <param name="timeout">
/// The maximum time for <c>select</c> to wait, provided in the form of a TIMEVAL structure. Set the timeout parameter to
/// <c>null</c> for blocking operations.
/// </param>
/// <returns>
/// <para>
/// The <c>select</c> function returns the total number of socket handles that are ready and contained in the fd_set structures,
/// zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can
/// be used to retrieve a specific error code.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The Windows Sockets implementation was unable to allocate needed resources for its internal operations, or the readfds,
/// writefds, exceptfds, or timeval parameters are not part of the user address space.
/// </term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The time-out value is not valid, or all three descriptor parameters were null.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>One of the descriptor sets contains an entry that is not a socket.</term>
2021-07-20 09:54:12 -04:00
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>select</c> function is used to determine the status of one or more sockets. For each socket, the caller can request
/// information on read, write, or error status. The set of sockets for which a given status is requested is indicated by an fd_set
/// structure. The sockets contained within the <c>fd_set</c> structures must be associated with a single service provider. For the
/// purpose of this restriction, sockets are considered to be from the same service provider if the WSAPROTOCOL_INFO structures
/// describing their protocols have the same providerId value. Upon return, the structures are updated to reflect the subset of
/// these sockets that meet the specified condition. The <c>select</c> function returns the number of sockets meeting the
/// conditions. A set of macros is provided for manipulating an <c>fd_set</c> structure. These macros are compatible with those used
/// in the Berkeley software, but the underlying representation is completely different.
/// </para>
/// <para>
/// The parameter readfds identifies the sockets that are to be checked for readability. If the socket is currently in the listen
/// state, it will be marked as readable if an incoming connection request has been received such that an accept is guaranteed to
/// complete without blocking. For other sockets, readability means that queued data is available for reading such that a call to
/// recv, WSARecv, WSARecvFrom, or recvfrom is guaranteed not to block.
/// </para>
/// <para>
/// For connection-oriented sockets, readability can also indicate that a request to close the socket has been received from the
/// peer. If the virtual circuit was closed gracefully, and all data was received, then a recv will return immediately with zero
/// bytes read. If the virtual circuit was reset, then a <c>recv</c> will complete immediately with an error code such as
/// WSAECONNRESET. The presence of OOB data will be checked if the socket option SO_OOBINLINE has been enabled (see setsockopt).
/// </para>
/// <para>
/// The parameter writefds identifies the sockets that are to be checked for writability. If a socket is processing a connect call
/// (nonblocking), a socket is writeable if the connection establishment successfully completes. If the socket is not processing a
/// <c>connect</c> call, writability means a send, sendto, or WSASendto are guaranteed to succeed. However, they can block on a
/// blocking socket if the len parameter exceeds the amount of outgoing system buffer space available. It is not specified how long
/// these guarantees can be assumed to be valid, particularly in a multithreaded environment.
/// </para>
/// <para>
/// The parameter exceptfds identifies the sockets that are to be checked for the presence of OOB data or any exceptional error conditions.
/// </para>
/// <para>
/// <c>Note</c> Out-of-band data will only be reported in this way if the option SO_OOBINLINE is <c>FALSE</c>. If a socket is
/// processing a connect call (nonblocking), failure of the connect attempt is indicated in exceptfds (application must then call
/// getsockopt SO_ERROR to determine the error value to describe why the failure occurred). This document does not define which
/// other errors will be included.
/// </para>
/// <para>
/// Any two of the parameters, readfds, writefds, or exceptfds, can be given as <c>null</c>. At least one must be non- <c>null</c>,
/// and any non- <c>null</c> descriptor set must contain at least one handle to a socket.
/// </para>
/// <para>In summary, a socket will be identified in a particular set when <c>select</c> returns if:</para>
/// <para>readfds:</para>
/// <list type="bullet">
/// <item>
/// <term>If listen has been called and a connection is pending, accept will succeed.</term>
/// </item>
/// <item>
/// <term>Data is available for reading (includes OOB data if SO_OOBINLINE is enabled).</term>
/// </item>
/// <item>
/// <term>Connection has been closed/reset/terminated.</term>
/// </item>
/// </list>
/// <para>writefds:</para>
/// <list type="bullet">
/// <item>
/// <term>If processing a connect call (nonblocking), connection has succeeded.</term>
/// </item>
/// <item>
/// <term>Data can be sent.</term>
/// </item>
/// </list>
/// <para>exceptfds:</para>
/// <list type="bullet">
/// <item>
/// <term>If processing a <c>connect</c> call (nonblocking), connection attempt failed.</term>
/// </item>
/// <item>
/// <term>OOB data is available for reading (only if SO_OOBINLINE is disabled).</term>
/// </item>
/// </list>
/// <para>
/// Four macros are defined in the header file Winsock2.h for manipulating and checking the descriptor sets. The variable FD_SETSIZE
/// determines the maximum number of descriptors in a set. (The default value of FD_SETSIZE is 64, which can be modified by defining
/// FD_SETSIZE to another value before including Winsock2.h.) Internally, socket handles in an fd_set structure are not represented
/// as bit flags as in Berkeley Unix. Their data representation is opaque. Use of these macros will maintain software portability
/// between different socket environments. The macros to manipulate and check <c>fd_set</c> contents are:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>FD_ZERO(*set) - Initializes set to the empty set. A set should always be cleared before using.</term>
/// </item>
/// <item>
/// <term>FD_CLR(s, *set) - Removes socket s from set.</term>
/// </item>
/// <item>
/// <term>FD_ISSET(s, *set) - Checks to see if s is a member of set and returns TRUE if so.</term>
/// </item>
/// <item>
/// <term>FD_SET(s, *set) - Adds socket s to set.</term>
/// </item>
/// </list>
/// <para>
/// The parameter time-out controls how long the <c>select</c> can take to complete. If time-out is a <c>null</c> pointer,
/// <c>select</c> will block indefinitely until at least one descriptor meets the specified criteria. Otherwise, time-out points to
/// a TIMEVAL structure that specifies the maximum time that <c>select</c> should wait before returning. When <c>select</c> returns,
/// the contents of the <c>TIMEVAL</c> structure are not altered. If <c>TIMEVAL</c> is initialized to {0, 0}, <c>select</c> will
/// return immediately; this is used to poll the state of the selected sockets. If <c>select</c> returns immediately, then the
/// <c>select</c> call is considered nonblocking and the standard assumptions for nonblocking calls apply. For example, the blocking
/// hook will not be called, and Windows Sockets will not yield.
/// </para>
/// <para>
/// <c>Note</c> The <c>select</c> function has no effect on the persistence of socket events registered with WSAAsyncSelect or WSAEventSelect.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>select</c> with the timeout parameter set to <c>NULL</c>, Winsock
/// may need to wait for a network event before the call can complete. Winsock performs an alertable wait in this situation, which
/// can be interrupted by an asynchronous procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call
/// inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must
/// never be attempted by Winsock clients.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select int WSAAPI select( int nfds, fd_set *readfds,
// fd_set *writefds, fd_set *exceptfds, const timeval *timeout );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "NF:winsock2.select")]
public static extern WSRESULT select([Optional] int nfds, ref fd_set readfds, ref fd_set writefds, ref fd_set exceptfds, in TIMEVAL timeout);
2021-07-20 09:54:12 -04:00
/// <summary>
/// The <c>select</c> function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O.
/// </summary>
/// <param name="nfds">Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.</param>
/// <param name="readfds">An optional pointer to a set of sockets to be checked for readability.</param>
/// <param name="writefds">An optional pointer to a set of sockets to be checked for writability.</param>
/// <param name="exceptfds">An optional pointer to a set of sockets to be checked for errors.</param>
/// <param name="timeout">
/// The maximum time for <c>select</c> to wait, provided in the form of a TIMEVAL structure. Set the timeout parameter to
/// <c>null</c> for blocking operations.
/// </param>
/// <returns>
/// <para>
/// The <c>select</c> function returns the total number of socket handles that are ready and contained in the fd_set structures,
/// zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can
/// be used to retrieve a specific error code.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The Windows Sockets implementation was unable to allocate needed resources for its internal operations, or the readfds,
/// writefds, exceptfds, or timeval parameters are not part of the user address space.
/// </term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The time-out value is not valid, or all three descriptor parameters were null.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>One of the descriptor sets contains an entry that is not a socket.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>select</c> function is used to determine the status of one or more sockets. For each socket, the caller can request
/// information on read, write, or error status. The set of sockets for which a given status is requested is indicated by an fd_set
/// structure. The sockets contained within the <c>fd_set</c> structures must be associated with a single service provider. For the
/// purpose of this restriction, sockets are considered to be from the same service provider if the WSAPROTOCOL_INFO structures
/// describing their protocols have the same providerId value. Upon return, the structures are updated to reflect the subset of
/// these sockets that meet the specified condition. The <c>select</c> function returns the number of sockets meeting the
/// conditions. A set of macros is provided for manipulating an <c>fd_set</c> structure. These macros are compatible with those used
/// in the Berkeley software, but the underlying representation is completely different.
/// </para>
/// <para>
/// The parameter readfds identifies the sockets that are to be checked for readability. If the socket is currently in the listen
/// state, it will be marked as readable if an incoming connection request has been received such that an accept is guaranteed to
/// complete without blocking. For other sockets, readability means that queued data is available for reading such that a call to
/// recv, WSARecv, WSARecvFrom, or recvfrom is guaranteed not to block.
/// </para>
/// <para>
/// For connection-oriented sockets, readability can also indicate that a request to close the socket has been received from the
/// peer. If the virtual circuit was closed gracefully, and all data was received, then a recv will return immediately with zero
/// bytes read. If the virtual circuit was reset, then a <c>recv</c> will complete immediately with an error code such as
/// WSAECONNRESET. The presence of OOB data will be checked if the socket option SO_OOBINLINE has been enabled (see setsockopt).
/// </para>
/// <para>
/// The parameter writefds identifies the sockets that are to be checked for writability. If a socket is processing a connect call
/// (nonblocking), a socket is writeable if the connection establishment successfully completes. If the socket is not processing a
/// <c>connect</c> call, writability means a send, sendto, or WSASendto are guaranteed to succeed. However, they can block on a
/// blocking socket if the len parameter exceeds the amount of outgoing system buffer space available. It is not specified how long
/// these guarantees can be assumed to be valid, particularly in a multithreaded environment.
/// </para>
/// <para>
/// The parameter exceptfds identifies the sockets that are to be checked for the presence of OOB data or any exceptional error conditions.
/// </para>
/// <para>
/// <c>Note</c> Out-of-band data will only be reported in this way if the option SO_OOBINLINE is <c>FALSE</c>. If a socket is
/// processing a connect call (nonblocking), failure of the connect attempt is indicated in exceptfds (application must then call
/// getsockopt SO_ERROR to determine the error value to describe why the failure occurred). This document does not define which
/// other errors will be included.
/// </para>
/// <para>
/// Any two of the parameters, readfds, writefds, or exceptfds, can be given as <c>null</c>. At least one must be non- <c>null</c>,
/// and any non- <c>null</c> descriptor set must contain at least one handle to a socket.
/// </para>
/// <para>In summary, a socket will be identified in a particular set when <c>select</c> returns if:</para>
/// <para>readfds:</para>
/// <list type="bullet">
/// <item>
/// <term>If listen has been called and a connection is pending, accept will succeed.</term>
/// </item>
/// <item>
/// <term>Data is available for reading (includes OOB data if SO_OOBINLINE is enabled).</term>
/// </item>
/// <item>
/// <term>Connection has been closed/reset/terminated.</term>
/// </item>
/// </list>
/// <para>writefds:</para>
/// <list type="bullet">
/// <item>
/// <term>If processing a connect call (nonblocking), connection has succeeded.</term>
/// </item>
/// <item>
/// <term>Data can be sent.</term>
/// </item>
/// </list>
/// <para>exceptfds:</para>
/// <list type="bullet">
/// <item>
/// <term>If processing a <c>connect</c> call (nonblocking), connection attempt failed.</term>
/// </item>
/// <item>
/// <term>OOB data is available for reading (only if SO_OOBINLINE is disabled).</term>
/// </item>
/// </list>
/// <para>
/// Four macros are defined in the header file Winsock2.h for manipulating and checking the descriptor sets. The variable FD_SETSIZE
/// determines the maximum number of descriptors in a set. (The default value of FD_SETSIZE is 64, which can be modified by defining
/// FD_SETSIZE to another value before including Winsock2.h.) Internally, socket handles in an fd_set structure are not represented
/// as bit flags as in Berkeley Unix. Their data representation is opaque. Use of these macros will maintain software portability
/// between different socket environments. The macros to manipulate and check <c>fd_set</c> contents are:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>FD_ZERO(*set) - Initializes set to the empty set. A set should always be cleared before using.</term>
/// </item>
/// <item>
/// <term>FD_CLR(s, *set) - Removes socket s from set.</term>
/// </item>
/// <item>
/// <term>FD_ISSET(s, *set) - Checks to see if s is a member of set and returns TRUE if so.</term>
/// </item>
/// <item>
/// <term>FD_SET(s, *set) - Adds socket s to set.</term>
/// </item>
/// </list>
/// <para>
/// The parameter time-out controls how long the <c>select</c> can take to complete. If time-out is a <c>null</c> pointer,
/// <c>select</c> will block indefinitely until at least one descriptor meets the specified criteria. Otherwise, time-out points to
/// a TIMEVAL structure that specifies the maximum time that <c>select</c> should wait before returning. When <c>select</c> returns,
/// the contents of the <c>TIMEVAL</c> structure are not altered. If <c>TIMEVAL</c> is initialized to {0, 0}, <c>select</c> will
/// return immediately; this is used to poll the state of the selected sockets. If <c>select</c> returns immediately, then the
/// <c>select</c> call is considered nonblocking and the standard assumptions for nonblocking calls apply. For example, the blocking
/// hook will not be called, and Windows Sockets will not yield.
/// </para>
/// <para>
/// <c>Note</c> The <c>select</c> function has no effect on the persistence of socket events registered with WSAAsyncSelect or WSAEventSelect.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>select</c> with the timeout parameter set to <c>NULL</c>, Winsock
/// may need to wait for a network event before the call can complete. Winsock performs an alertable wait in this situation, which
/// can be interrupted by an asynchronous procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call
/// inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must
/// never be attempted by Winsock clients.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select int WSAAPI select( int nfds, fd_set *readfds,
// fd_set *writefds, fd_set *exceptfds, const timeval *timeout );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "NF:winsock2.select")]
public static extern WSRESULT select([Optional] int nfds, [In, Out, Optional] IntPtr readfds, [In, Out, Optional] IntPtr writefds, [In, Out, Optional] IntPtr exceptfds, [In, Optional] IntPtr timeout);
2021-07-20 09:54:12 -04:00
/// <summary>The <c>send</c> function sends data on a connected socket.</summary>
/// <param name="s">A descriptor identifying a connected socket.</param>
/// <param name="buf">A pointer to a buffer containing the data to be transmitted.</param>
/// <param name="len">The length, in bytes, of the data in buffer pointed to by the buf parameter.</param>
/// <param name="flags">
/// <para>
/// A set of flags that specify the way in which the call is made. This parameter is constructed by using the bitwise OR operator
/// with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_DONTROUTE</term>
/// <term>
/// Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Sends OOB data (stream-style socket such as SOCK_STREAM only.</term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>send</c> returns the total number of bytes sent, which can be less than the number requested to be sent
/// in the len parameter. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEACCES</term>
/// <term>
/// The requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST socket
/// option to enable use of the broadcast address.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The buf parameter is not completely contained in a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>The connection has been broken due to the keep-alive activity detecting a failure while the operation was in progress.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to send on a socket after shutdown has been invoked with how set to SD_SEND or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the requested operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The socket is message oriented, and the message is larger than the maximum supported by the underlying transport.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>The remote host cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with
/// SO_OOBINLINE enabled.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. For UDP sockets, the remote host was unable
/// to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet. The application should close the
/// socket as it is no longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>
/// The connection has been dropped, because of a network failure or because the system on the other end went down without notice.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>send</c> function is used to write outgoing data on a connected socket.</para>
/// <para>
/// For message-oriented sockets (address family of <c>AF_INET</c> or <c>AF_INET6</c>, type of <c>SOCK_DGRAM</c>, and protocol of
/// <c>IPPROTO_UDP</c>, for example), care must be taken not to exceed the maximum packet size of the underlying provider. The
/// maximum message packet size for a provider can be obtained by calling getsockopt with the optname parameter set to
/// <c>SO_MAX_MSG_SIZE</c> to retrieve the value of socket option. If the data is too long to pass atomically through the underlying
/// protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.
/// </para>
/// <para>
/// The successful completion of a <c>send</c> function does not indicate that the data was successfully delivered and received to
/// the recipient. This function only indicates the data was successfully sent.
/// </para>
/// <para>
/// If no buffer space is available within the transport system to hold the data to be transmitted, <c>send</c> will block unless
/// the socket has been placed in nonblocking mode. On nonblocking stream oriented sockets, the number of bytes written can be
/// between 1 and the requested length, depending on buffer availability on both the client and server computers. The select,
/// WSAAsyncSelect or WSAEventSelect functions can be used to determine when it is possible to send more data.
/// </para>
/// <para>
/// Calling <c>send</c> with a len parameter of zero is permissible and will be treated by implementations as successful. In such
/// cases, <c>send</c> will return zero as a valid value. For message-oriented sockets, a zero-length transport datagram is sent.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function beyond the options specified for the associated
/// socket. The semantics of the <c>send</c> function are determined by any options previously set on the socket specified in the s
/// parameter and the flags parameter passed to the <c>send</c> function.
/// </para>
/// <para>
/// The order of calls made to <c>send</c> is also the order in which the buffers are transmitted to the transport layer.
/// <c>send</c> should not be called on the same stream-oriented socket concurrently from different threads, because some Winsock
/// providers may split a large send request into multiple transmissions, and this may lead to unintended data interleaving from
/// multiple concurrent send requests on the same stream-oriented socket.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>send</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>send</c> function.</para>
/// <para>Example Code</para>
/// <para>For a another example that uses the <c>send</c> function, see Getting Started With Winsock.</para>
/// <para>Notes for IrDA Sockets</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// </list>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-send int WSAAPI send( SOCKET s, const char *buf, int len,
// int flags );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "902bb9cf-d847-43fc-8282-394d619b8f1b")]
public static extern int send(SOCKET s, IntPtr buf, int len, int flags);
/// <summary>The <c>send</c> function sends data on a connected socket.</summary>
/// <param name="s">A descriptor identifying a connected socket.</param>
/// <param name="buf">A pointer to a buffer containing the data to be transmitted.</param>
/// <param name="len">The length, in bytes, of the data in buffer pointed to by the buf parameter.</param>
/// <param name="flags">
/// <para>
/// A set of flags that specify the way in which the call is made. This parameter is constructed by using the bitwise OR operator
/// with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_DONTROUTE</term>
/// <term>
/// Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Sends OOB data (stream-style socket such as SOCK_STREAM only.</term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>send</c> returns the total number of bytes sent, which can be less than the number requested to be sent
/// in the len parameter. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEACCES</term>
/// <term>
/// The requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST socket
/// option to enable use of the broadcast address.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The buf parameter is not completely contained in a valid part of the user address space.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>The connection has been broken due to the keep-alive activity detecting a failure while the operation was in progress.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to send on a socket after shutdown has been invoked with how set to SD_SEND or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the requested operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The socket is message oriented, and the message is larger than the maximum supported by the underlying transport.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>The remote host cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with
/// SO_OOBINLINE enabled.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. For UDP sockets, the remote host was unable
/// to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet. The application should close the
/// socket as it is no longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>
/// The connection has been dropped, because of a network failure or because the system on the other end went down without notice.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>send</c> function is used to write outgoing data on a connected socket.</para>
/// <para>
/// For message-oriented sockets (address family of <c>AF_INET</c> or <c>AF_INET6</c>, type of <c>SOCK_DGRAM</c>, and protocol of
/// <c>IPPROTO_UDP</c>, for example), care must be taken not to exceed the maximum packet size of the underlying provider. The
/// maximum message packet size for a provider can be obtained by calling getsockopt with the optname parameter set to
/// <c>SO_MAX_MSG_SIZE</c> to retrieve the value of socket option. If the data is too long to pass atomically through the underlying
/// protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.
/// </para>
/// <para>
/// The successful completion of a <c>send</c> function does not indicate that the data was successfully delivered and received to
/// the recipient. This function only indicates the data was successfully sent.
/// </para>
/// <para>
/// If no buffer space is available within the transport system to hold the data to be transmitted, <c>send</c> will block unless
/// the socket has been placed in nonblocking mode. On nonblocking stream oriented sockets, the number of bytes written can be
/// between 1 and the requested length, depending on buffer availability on both the client and server computers. The select,
/// WSAAsyncSelect or WSAEventSelect functions can be used to determine when it is possible to send more data.
/// </para>
/// <para>
/// Calling <c>send</c> with a len parameter of zero is permissible and will be treated by implementations as successful. In such
/// cases, <c>send</c> will return zero as a valid value. For message-oriented sockets, a zero-length transport datagram is sent.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function beyond the options specified for the associated
/// socket. The semantics of the <c>send</c> function are determined by any options previously set on the socket specified in the s
/// parameter and the flags parameter passed to the <c>send</c> function.
/// </para>
/// <para>
/// The order of calls made to <c>send</c> is also the order in which the buffers are transmitted to the transport layer.
/// <c>send</c> should not be called on the same stream-oriented socket concurrently from different threads, because some Winsock
/// providers may split a large send request into multiple transmissions, and this may lead to unintended data interleaving from
/// multiple concurrent send requests on the same stream-oriented socket.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>send</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>send</c> function.</para>
/// <para>Example Code</para>
/// <para>For a another example that uses the <c>send</c> function, see Getting Started With Winsock.</para>
/// <para>Notes for IrDA Sockets</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// </list>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-send int WSAAPI send( SOCKET s, const char *buf, int len,
// int flags );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "902bb9cf-d847-43fc-8282-394d619b8f1b")]
public static extern int send(SOCKET s, byte[] buf, int len, int flags);
/// <summary>The <c>sendto</c> function sends data to a specific destination.</summary>
/// <param name="s">A descriptor identifying a (possibly connected) socket.</param>
/// <param name="buf">A pointer to a buffer containing the data to be transmitted.</param>
/// <param name="len">The length, in bytes, of the data pointed to by the buf parameter.</param>
/// <param name="flags">A set of flags that specify the way in which the call is made.</param>
/// <param name="to">An optional pointer to a sockaddr structure that contains the address of the target socket.</param>
/// <param name="tolen">The size, in bytes, of the address pointed to by the to parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>sendto</c> returns the total number of bytes sent, which can be less than the number indicated by len.
/// Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEACCES</term>
/// <term>
/// The requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST
/// parameter to allow the use of the broadcast address.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>An unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The buf or to parameters are not part of the user address space, or the tolen parameter is too small.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected (connection-oriented sockets only).</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to sendto on a socket after shutdown has been invoked with how set to SD_SEND
/// or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the requested operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The socket is message oriented, and the message is larger than the maximum supported by the underlying transport.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>The remote host cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. For UPD sockets, the remote host was unable
/// to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet. The application should close the
/// socket as it is no longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAEADDRNOTAVAIL</term>
/// <term>The remote address is not a valid address, for example, ADDR_ANY.</term>
/// </item>
/// <item>
/// <term>WSAEAFNOSUPPORT</term>
/// <term>Addresses in the specified family cannot be used with this socket.</term>
/// </item>
/// <item>
/// <term>WSAEDESTADDRREQ</term>
/// <term>A destination address is required.</term>
/// </item>
/// <item>
/// <term>WSAENETUNREACH</term>
/// <term>The network cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>A socket operation was attempted to an unreachable host.</term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>
/// The connection has been dropped, because of a network failure or because the system on the other end went down without notice.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>sendto</c> function is used to write outgoing data on a socket. For message-oriented sockets, care must be taken not to
/// exceed the maximum packet size of the underlying subnets, which can be obtained by using getsockopt to retrieve the value of
/// socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE
/// is returned and no data is transmitted.
/// </para>
/// <para>
/// The to parameter can be any valid address in the socket's address family, including a broadcast or any multicast address. To
/// send to a broadcast address, an application must have used setsockopt with SO_BROADCAST enabled. Otherwise, <c>sendto</c> will
/// fail with the error code WSAEACCES. For TCP/IP, an application can send to any multicast address (without becoming a group member).
/// </para>
/// <para>
/// <c>Note</c> If a socket is opened, a setsockopt call is made, and then a <c>sendto</c> call is made, Windows Sockets performs an
/// implicit <c>bind</c> function call.
/// </para>
/// <para>
/// If the socket is unbound, unique values are assigned to the local association by the system, and the socket is then marked as
/// bound. If the socket is connected, the getsockname function can be used to determine the local IP address and port associated
/// with the socket.
/// </para>
/// <para>
/// If the socket is not connected, the getsockname function can be used to determine the local port number associated with the
/// socket but the IP address returned is set to the wildcard address for the given protocol (for example, INADDR_ANY or "0.0.0.0"
/// for IPv4 and IN6ADDR_ANY_INIT or "::" for IPv6).
/// </para>
/// <para>The successful completion of a <c>sendto</c> does not indicate that the data was successfully delivered.</para>
/// <para>
/// The <c>sendto</c> function is normally used on a connectionless socket to send a datagram to a specific peer socket identified
/// by the to parameter. Even if the connectionless socket has been previously connected to a specific address, the to parameter
/// overrides the destination address for that particular datagram only. On a connection-oriented socket, the to and tolen
/// parameters are ignored, making <c>sendto</c> equivalent to send.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>sendto</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>sendto</c> function.</para>
/// <para>For Sockets Using IP (Version 4)</para>
/// <para>
/// To send a broadcast (on a SOCK_DGRAM only), the address pointed to by the to parameter can be constructed to contain the special
/// IPv4 address INADDR_BROADCAST (defined in Winsock2.h), together with the intended port number. If the address pointed to by the
/// to parameter contains the INADDR_BROADCAST address and intended port, then the broadcast will be sent out on all interfaces to
/// that port.
/// </para>
/// <para>
/// If the broadcast should be sent out only on a specific interface, then the address pointed to by the to parameter should contain
/// the subnet broadcast address for the interface and the intended port. For example, an IPv4 network address of 192.168.1.0 with a
/// subnet mask of 255.255.255.0 would use a subnet broadcast address of 192.168.1.255.
/// </para>
/// <para>
/// It is generally inadvisable for a broadcast datagram to exceed the size at which fragmentation can occur, which implies that the
/// data portion of the datagram (excluding headers) should not exceed 512 bytes.
/// </para>
/// <para>
/// If no buffer space is available within the transport system to hold the data to be transmitted, <c>sendto</c> will block unless
/// the socket has been placed in a nonblocking mode. On nonblocking, stream oriented sockets, the number of bytes written can be
/// between 1 and the requested length, depending on buffer availability on both the client and server systems. The select,
/// WSAAsyncSelect or WSAEventSelect function can be used to determine when it is possible to send more data.
/// </para>
/// <para>
/// Calling <c>sendto</c> with a len of zero is permissible and will return zero as a valid value. For message-oriented sockets, a
/// zero-length transport datagram is sent.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the
/// associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is
/// constructed by using the bitwise OR operator with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_DONTROUTE</term>
/// <term>
/// Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Sends OOB data (stream-style socket such as SOCK_STREAM only).</term>
/// </item>
/// </list>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-sendto int sendto( SOCKET s, const char *buf, int len, int
// flags, const sockaddr *to, int tolen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "a1c89c6b-d11d-4d3e-a664-af2beed0cd09")]
public static extern int sendto(SOCKET s, IntPtr buf, int len, int flags, SOCKADDR to, int tolen);
/// <summary>The <c>sendto</c> function sends data to a specific destination.</summary>
/// <param name="s">A descriptor identifying a (possibly connected) socket.</param>
/// <param name="buf">A pointer to a buffer containing the data to be transmitted.</param>
/// <param name="len">The length, in bytes, of the data pointed to by the buf parameter.</param>
/// <param name="flags">A set of flags that specify the way in which the call is made.</param>
/// <param name="to">An optional pointer to a sockaddr structure that contains the address of the target socket.</param>
/// <param name="tolen">The size, in bytes, of the address pointed to by the to parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>sendto</c> returns the total number of bytes sent, which can be less than the number indicated by len.
/// Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEACCES</term>
/// <term>
/// The requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST
/// parameter to allow the use of the broadcast address.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>An unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.</term>
/// </item>
/// <item>
/// <term>WSAEINTR</term>
/// <term>A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.</term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>The buf or to parameters are not part of the user address space, or the tolen parameter is too small.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected (connection-oriented sockets only).</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// <item>
/// <term>WSAEOPNOTSUPP</term>
/// <term>
/// MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the
/// communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.
/// </term>
/// </item>
/// <item>
/// <term>WSAESHUTDOWN</term>
/// <term>
/// The socket has been shut down; it is not possible to sendto on a socket after shutdown has been invoked with how set to SD_SEND
/// or SD_BOTH.
/// </term>
/// </item>
/// <item>
/// <term>WSAEWOULDBLOCK</term>
/// <term>The socket is marked as nonblocking and the requested operation would block.</term>
/// </item>
/// <item>
/// <term>WSAEMSGSIZE</term>
/// <term>The socket is message oriented, and the message is larger than the maximum supported by the underlying transport.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>The remote host cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. For UPD sockets, the remote host was unable
/// to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet. The application should close the
/// socket as it is no longer usable.
/// </term>
/// </item>
/// <item>
/// <term>WSAEADDRNOTAVAIL</term>
/// <term>The remote address is not a valid address, for example, ADDR_ANY.</term>
/// </item>
/// <item>
/// <term>WSAEAFNOSUPPORT</term>
/// <term>Addresses in the specified family cannot be used with this socket.</term>
/// </item>
/// <item>
/// <term>WSAEDESTADDRREQ</term>
/// <term>A destination address is required.</term>
/// </item>
/// <item>
/// <term>WSAENETUNREACH</term>
/// <term>The network cannot be reached from this host at this time.</term>
/// </item>
/// <item>
/// <term>WSAEHOSTUNREACH</term>
/// <term>A socket operation was attempted to an unreachable host.</term>
/// </item>
/// <item>
/// <term>WSAETIMEDOUT</term>
/// <term>
/// The connection has been dropped, because of a network failure or because the system on the other end went down without notice.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>sendto</c> function is used to write outgoing data on a socket. For message-oriented sockets, care must be taken not to
/// exceed the maximum packet size of the underlying subnets, which can be obtained by using getsockopt to retrieve the value of
/// socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE
/// is returned and no data is transmitted.
/// </para>
/// <para>
/// The to parameter can be any valid address in the socket's address family, including a broadcast or any multicast address. To
/// send to a broadcast address, an application must have used setsockopt with SO_BROADCAST enabled. Otherwise, <c>sendto</c> will
/// fail with the error code WSAEACCES. For TCP/IP, an application can send to any multicast address (without becoming a group member).
/// </para>
/// <para>
/// <c>Note</c> If a socket is opened, a setsockopt call is made, and then a <c>sendto</c> call is made, Windows Sockets performs an
/// implicit <c>bind</c> function call.
/// </para>
/// <para>
/// If the socket is unbound, unique values are assigned to the local association by the system, and the socket is then marked as
/// bound. If the socket is connected, the getsockname function can be used to determine the local IP address and port associated
/// with the socket.
/// </para>
/// <para>
/// If the socket is not connected, the getsockname function can be used to determine the local port number associated with the
/// socket but the IP address returned is set to the wildcard address for the given protocol (for example, INADDR_ANY or "0.0.0.0"
/// for IPv4 and IN6ADDR_ANY_INIT or "::" for IPv6).
/// </para>
/// <para>The successful completion of a <c>sendto</c> does not indicate that the data was successfully delivered.</para>
/// <para>
/// The <c>sendto</c> function is normally used on a connectionless socket to send a datagram to a specific peer socket identified
/// by the to parameter. Even if the connectionless socket has been previously connected to a specific address, the to parameter
/// overrides the destination address for that particular datagram only. On a connection-oriented socket, the to and tolen
/// parameters are ignored, making <c>sendto</c> equivalent to send.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>sendto</c>, Winsock may need to wait for a network event before the
/// call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure
/// call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing
/// blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the use of the <c>sendto</c> function.</para>
/// <para>For Sockets Using IP (Version 4)</para>
/// <para>
/// To send a broadcast (on a SOCK_DGRAM only), the address pointed to by the to parameter can be constructed to contain the special
/// IPv4 address INADDR_BROADCAST (defined in Winsock2.h), together with the intended port number. If the address pointed to by the
/// to parameter contains the INADDR_BROADCAST address and intended port, then the broadcast will be sent out on all interfaces to
/// that port.
/// </para>
/// <para>
/// If the broadcast should be sent out only on a specific interface, then the address pointed to by the to parameter should contain
/// the subnet broadcast address for the interface and the intended port. For example, an IPv4 network address of 192.168.1.0 with a
/// subnet mask of 255.255.255.0 would use a subnet broadcast address of 192.168.1.255.
/// </para>
/// <para>
/// It is generally inadvisable for a broadcast datagram to exceed the size at which fragmentation can occur, which implies that the
/// data portion of the datagram (excluding headers) should not exceed 512 bytes.
/// </para>
/// <para>
/// If no buffer space is available within the transport system to hold the data to be transmitted, <c>sendto</c> will block unless
/// the socket has been placed in a nonblocking mode. On nonblocking, stream oriented sockets, the number of bytes written can be
/// between 1 and the requested length, depending on buffer availability on both the client and server systems. The select,
/// WSAAsyncSelect or WSAEventSelect function can be used to determine when it is possible to send more data.
/// </para>
/// <para>
/// Calling <c>sendto</c> with a len of zero is permissible and will return zero as a valid value. For message-oriented sockets, a
/// zero-length transport datagram is sent.
/// </para>
/// <para>
/// The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the
/// associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is
/// constructed by using the bitwise OR operator with any of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>MSG_DONTROUTE</term>
/// <term>
/// Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.
/// </term>
/// </item>
/// <item>
/// <term>MSG_OOB</term>
/// <term>Sends OOB data (stream-style socket such as SOCK_STREAM only).</term>
/// </item>
/// </list>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-sendto int sendto( SOCKET s, const char *buf, int len, int
// flags, const sockaddr *to, int tolen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "a1c89c6b-d11d-4d3e-a664-af2beed0cd09")]
public static extern int sendto(SOCKET s, byte[] buf, int len, int flags, SOCKADDR to, int tolen);
/// <summary>The <c>setsockopt</c> function sets a socket option.</summary>
/// <param name="s">A descriptor that identifies a socket.</param>
/// <param name="level">The level at which the option is defined (for example, SOL_SOCKET).</param>
/// <param name="optname">
/// The socket option for which the value is to be set (for example, SO_BROADCAST). The optname parameter must be a socket option
/// defined within the specified level, or behavior is undefined.
/// </param>
/// <param name="optval">A pointer to the buffer in which the value for the requested option is specified.</param>
/// <param name="optlen">The size, in bytes, of the buffer pointed to by the optval parameter.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>setsockopt</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code
/// can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The buffer pointed to by the optval parameter is not in a valid part of the process address space or the optlen parameter is too small.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The level parameter is not valid, or the information in the buffer pointed to by the optval parameter is not valid.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>The connection has timed out when SO_KEEPALIVE is set.</term>
/// </item>
/// <item>
/// <term>WSAENOPROTOOPT</term>
/// <term>The option is unknown or unsupported for the specified provider or socket (see SO_GROUP_PRIORITY limitations).</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The connection has been reset when SO_KEEPALIVE is set.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>setsockopt</c> function sets the current value for a socket option associated with a socket of any type, in any state.
/// Although options can exist at multiple protocol levels, they are always present at the uppermost socket level. Options affect
/// socket operations, such as whether expedited data (OOB data for example) is received in the normal data stream, and whether
/// broadcast messages can be sent on the socket.
/// </para>
/// <para>
/// <c>Note</c> If the <c>setsockopt</c> function is called before the bind function, TCP/IP options will not be checked by using
/// TCP/IP until the <c>bind</c> occurs. In this case, the <c>setsockopt</c> function call will always succeed, but the <c>bind</c>
/// function call can fail because of an early <c>setsockopt</c> call failing.
/// </para>
/// <para>
/// <c>Note</c> If a socket is opened, a <c>setsockopt</c> call is made, and then a sendto call is made, Windows Sockets performs an
/// implicit bind function call.
/// </para>
/// <para>
/// There are two types of socket options: Boolean options that enable or disable a feature or behavior, and options that require an
/// integer value or structure. To enable a Boolean option, the optval parameter points to a nonzero integer. To disable the option
/// optval points to an integer equal to zero. The optlen parameter should be equal to for Boolean options. For other options,
/// optval points to an integer or structure that contains the desired value for the option, and optlen is the length of the integer
/// or structure.
/// </para>
/// <para>
/// The following tables list some of the common options supported by the <c>setsockopt</c> function. The Type column identifies the
/// type of data addressed by optval parameter. The Description column provides some basic information about the socket option. For
/// more complete lists of socket options and more detailed information (default values, for example), see the detailed topics under
/// Socket Options.
/// </para>
/// <para>level = <c>SOL_SOCKET</c></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>SO_BROADCAST</term>
/// <term>BOOL</term>
/// <term>Configures a socket for sending broadcast data.</term>
/// </item>
/// <item>
/// <term>SO_CONDITIONAL_ACCEPT</term>
/// <term>BOOL</term>
/// <term>Enables incoming connections are to be accepted or rejected by the application, not by the protocol stack.</term>
/// </item>
/// <item>
/// <term>SO_DEBUG</term>
/// <term>BOOL</term>
/// <term>Enables debug output. Microsoft providers currently do not output any debug information.</term>
/// </item>
/// <item>
/// <term>SO_DONTLINGER</term>
/// <term>BOOL</term>
/// <term>
/// Does not block close waiting for unsent data to be sent. Setting this option is equivalent to setting SO_LINGER with l_onoff set
/// to zero.
/// </term>
/// </item>
/// <item>
/// <term>SO_DONTROUTE</term>
/// <term>BOOL</term>
/// <term>
/// Sets whether outgoing data should be sent on interface the socket is bound to and not a routed on some other interface. This
/// option is not supported on ATM sockets (results in an error).
/// </term>
/// </item>
/// <item>
/// <term>SO_GROUP_PRIORITY</term>
/// <term>int</term>
/// <term>Reserved.</term>
/// </item>
/// <item>
/// <term>SO_KEEPALIVE</term>
/// <term>BOOL</term>
/// <term>Enables sending keep-alive packets for a socket connection. Not supported on ATM sockets (results in an error).</term>
/// </item>
/// <item>
/// <term>SO_LINGER</term>
/// <term>LINGER</term>
/// <term>Lingers on close if unsent data is present.</term>
/// </item>
/// <item>
/// <term>SO_OOBINLINE</term>
/// <term>BOOL</term>
/// <term>
/// Indicates that out-of-bound data should be returned in-line with regular data. This option is only valid for connection-oriented
/// protocols that support out-of-band data. For a discussion of this topic, see Protocol Independent Out-Of-band Data.
/// </term>
/// </item>
/// <item>
/// <term>SO_RCVBUF</term>
/// <term>int</term>
/// <term>Specifies the total per-socket buffer space reserved for receives.</term>
/// </item>
/// <item>
/// <term>SO_REUSEADDR</term>
/// <term>BOOL</term>
/// <term>
/// Allows the socket to be bound to an address that is already in use. For more information, see bind. Not applicable on ATM sockets.
/// </term>
/// </item>
/// <item>
/// <term>SO_EXCLUSIVEADDRUSE</term>
/// <term>BOOL</term>
/// <term>Enables a socket to be bound for exclusive access. Does not require administrative privilege.</term>
/// </item>
/// <item>
/// <term>SO_RCVTIMEO</term>
/// <term>DWORD</term>
/// <term>Sets the timeout, in milliseconds, for blocking receive calls.</term>
/// </item>
/// <item>
/// <term>SO_SNDBUF</term>
/// <term>int</term>
/// <term>Specifies the total per-socket buffer space reserved for sends.</term>
/// </item>
/// <item>
/// <term>SO_SNDTIMEO</term>
/// <term>DWORD</term>
/// <term>The timeout, in milliseconds, for blocking send calls.</term>
/// </item>
/// <item>
/// <term>SO_UPDATE_ACCEPT_CONTEXT</term>
/// <term>int</term>
/// <term>Updates the accepting socket with the context of the listening socket.</term>
/// </item>
/// <item>
/// <term>PVD_CONFIG</term>
/// <term>Service Provider Dependent</term>
/// <term>
/// This object stores the configuration information for the service provider associated with socket s. The exact format of this
/// data structure is service provider specific.
/// </term>
/// </item>
/// </list>
/// <para>For more complete and detailed information about socket options for level = <c>SOL_SOCKET</c>, see SOL_SOCKET Socket Options.</para>
/// <para>level = <c>IPPROTO_TCP</c></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>TCP_NODELAY</term>
/// <term>BOOL</term>
/// <term>
/// Disables the Nagle algorithm for send coalescing.This socket option is included for backward compatibility with Windows Sockets 1.1
/// </term>
/// </item>
/// </list>
/// <para>
/// For more complete and detailed information about socket options for level = <c>IPPROTO_TCP</c>, see IPPROTO_TCP Socket Options.
/// </para>
/// <para>level = <c>NSPROTO_IPX</c></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>IPX_PTYPE</term>
/// <term>int</term>
/// <term>Sets the IPX packet type.</term>
/// </item>
/// <item>
/// <term>IPX_FILTERPTYPE</term>
/// <term>int</term>
/// <term>Sets the receive filter packet type</term>
/// </item>
/// <item>
/// <term>IPX_STOPFILTERPTYPE</term>
/// <term>int</term>
/// <term>Stops filtering the filter type set with IPX_FILTERTYPE</term>
/// </item>
/// <item>
/// <term>IPX_DSTYPE</term>
/// <term>int</term>
/// <term>Sets the value of the data stream field in the SPX header on every packet sent.</term>
/// </item>
/// <item>
/// <term>IPX_EXTENDED_ADDRESS</term>
/// <term>BOOL</term>
/// <term>Sets whether extended addressing is enabled.</term>
/// </item>
/// <item>
/// <term>IPX_RECVHDR</term>
/// <term>BOOL</term>
/// <term>Sets whether the protocol header is sent up on all receive headers.</term>
/// </item>
/// <item>
/// <term>IPX_RECEIVE_BROADCAST</term>
/// <term>BOOL</term>
/// <term>
/// Indicates broadcast packets are likely on the socket. Set to TRUE by default. Applications that do not use broadcasts should set
/// this to FALSE for better system performance.
/// </term>
/// </item>
/// <item>
/// <term>IPX_IMMEDIATESPXACK</term>
/// <term>BOOL</term>
/// <term>
/// Directs SPX connections not to delay before sending an ACK. Applications without back-and-forth traffic should set this to TRUE
/// to increase performance.
/// </term>
/// </item>
/// </list>
/// <para>
/// For more complete and detailed information about socket options for level = <c>NSPROTO_IPX</c>, see NSPROTO_IPX Socket Options.
/// </para>
/// <para>BSD options not supported for <c>setsockopt</c> are shown in the following table.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>SO_ACCEPTCONN</term>
/// <term>BOOL</term>
/// <term>
/// Returns whether a socket is in listening mode. This option is only Valid for connection-oriented protocols. This socket option
/// is not supported for the setting.
/// </term>
/// </item>
/// <item>
/// <term>SO_RCVLOWAT</term>
/// <term>int</term>
/// <term>
/// A socket option from BSD UNIX included for backward compatibility. This option sets the minimum number of bytes to process for
/// socket input operations.
/// </term>
/// </item>
/// <item>
/// <term>SO_SNDLOWAT</term>
/// <term>int</term>
/// <term>
/// A socket option from BSD UNIX included for backward compatibility. This option sets the minimum number of bytes to process for
/// socket output operations.
/// </term>
/// </item>
/// <item>
/// <term>SO_TYPE</term>
/// <term>int</term>
/// <term>
/// Returns the socket type for the given socket (SOCK_STREAM or SOCK_DGRAM, for example This socket option is not supported for the
/// setting the socket type.
/// </term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>setsockopt</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the <c>setsockopt</c> function.</para>
/// <para>Notes for IrDA Sockets</para>
/// <para>When developing applications using Windows sockets for IrDA, note the following:</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>IrDA provides the following socket option:</term>
/// </item>
/// </list>
/// <para>
/// The IRLMP_IAS_SET socket option enables the application to set a single attribute of a single class in the local IAS. The
/// application specifies the class to set, the attribute, and attribute type. The application is expected to allocate a buffer of
/// the necessary size for the passed parameters.
/// </para>
/// <para>
/// IrDA provides an IAS database that stores IrDA-based information. Limited access to the IAS database is available through the
/// Windows Sockets 2 interface, but such access is not normally used by applications, and exists primarily to support connections
/// to non-Windows devices that are not compliant with the Windows Sockets 2 IrDA conventions.
/// </para>
/// <para>The following structure, <c>IAS_SET</c>, is used with the IRLMP_IAS_SET setsockopt option to manage the local IAS database:</para>
/// <para>The following structure, <c>IAS_QUERY</c>, is used with the IRLMP_IAS_QUERY setsockopt option to query a peer's IAS database:</para>
/// <para>Many SO_ level socket options are not meaningful to IrDA. Only SO_LINGER is specifically supported.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-setsockopt int setsockopt( SOCKET s, int level, int
// optname, const char *optval, int optlen );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "3a6960c9-0c04-4403-aee1-ce250459dc30")]
public static extern WSRESULT setsockopt(SOCKET s, int level, int optname, IntPtr optval, int optlen);
2022-07-05 22:19:30 -04:00
/// <summary>The <c>setsockopt</c> function sets a socket option.</summary>
/// <param name="s">A descriptor that identifies a socket.</param>
/// <param name="level">The level at which the option is defined (for example, SOL_SOCKET).</param>
/// <param name="optname">
/// The socket option for which the value is to be set (for example, SO_BROADCAST). The optname parameter must be a socket option
/// defined within the specified level, or behavior is undefined.
/// </param>
/// <param name="optval">The value for the requested option is specified.</param>
/// <returns>
/// <para>
/// If no error occurs, <c>setsockopt</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code
/// can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAEFAULT</term>
/// <term>
/// The buffer pointed to by the optval parameter is not in a valid part of the process address space or the optlen parameter is too small.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>The level parameter is not valid, or the information in the buffer pointed to by the optval parameter is not valid.</term>
/// </item>
/// <item>
/// <term>WSAENETRESET</term>
/// <term>The connection has timed out when SO_KEEPALIVE is set.</term>
/// </item>
/// <item>
/// <term>WSAENOPROTOOPT</term>
/// <term>The option is unknown or unsupported for the specified provider or socket (see SO_GROUP_PRIORITY limitations).</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The connection has been reset when SO_KEEPALIVE is set.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term>The descriptor is not a socket.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>setsockopt</c> function sets the current value for a socket option associated with a socket of any type, in any state.
/// Although options can exist at multiple protocol levels, they are always present at the uppermost socket level. Options affect
/// socket operations, such as whether expedited data (OOB data for example) is received in the normal data stream, and whether
/// broadcast messages can be sent on the socket.
/// </para>
/// <para>
/// <c>Note</c> If the <c>setsockopt</c> function is called before the bind function, TCP/IP options will not be checked by using
/// TCP/IP until the <c>bind</c> occurs. In this case, the <c>setsockopt</c> function call will always succeed, but the <c>bind</c>
/// function call can fail because of an early <c>setsockopt</c> call failing.
/// </para>
/// <para>
/// <c>Note</c> If a socket is opened, a <c>setsockopt</c> call is made, and then a sendto call is made, Windows Sockets performs an
/// implicit bind function call.
/// </para>
/// <para>
/// There are two types of socket options: Boolean options that enable or disable a feature or behavior, and options that require an
/// integer value or structure. To enable a Boolean option, the optval parameter points to a nonzero integer. To disable the option
/// optval points to an integer equal to zero. The optlen parameter should be equal to for Boolean options. For other options,
/// optval points to an integer or structure that contains the desired value for the option, and optlen is the length of the integer
/// or structure.
/// </para>
/// <para>
/// The following tables list some of the common options supported by the <c>setsockopt</c> function. The Type column identifies the
/// type of data addressed by optval parameter. The Description column provides some basic information about the socket option. For
/// more complete lists of socket options and more detailed information (default values, for example), see the detailed topics under
/// Socket Options.
/// </para>
/// <para>level = <c>SOL_SOCKET</c></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>SO_BROADCAST</term>
/// <term>BOOL</term>
/// <term>Configures a socket for sending broadcast data.</term>
/// </item>
/// <item>
/// <term>SO_CONDITIONAL_ACCEPT</term>
/// <term>BOOL</term>
/// <term>Enables incoming connections are to be accepted or rejected by the application, not by the protocol stack.</term>
/// </item>
/// <item>
/// <term>SO_DEBUG</term>
/// <term>BOOL</term>
/// <term>Enables debug output. Microsoft providers currently do not output any debug information.</term>
/// </item>
/// <item>
/// <term>SO_DONTLINGER</term>
/// <term>BOOL</term>
/// <term>
/// Does not block close waiting for unsent data to be sent. Setting this option is equivalent to setting SO_LINGER with l_onoff set
/// to zero.
/// </term>
/// </item>
/// <item>
/// <term>SO_DONTROUTE</term>
/// <term>BOOL</term>
/// <term>
/// Sets whether outgoing data should be sent on interface the socket is bound to and not a routed on some other interface. This
/// option is not supported on ATM sockets (results in an error).
/// </term>
/// </item>
/// <item>
/// <term>SO_GROUP_PRIORITY</term>
/// <term>int</term>
/// <term>Reserved.</term>
/// </item>
/// <item>
/// <term>SO_KEEPALIVE</term>
/// <term>BOOL</term>
/// <term>Enables sending keep-alive packets for a socket connection. Not supported on ATM sockets (results in an error).</term>
/// </item>
/// <item>
/// <term>SO_LINGER</term>
/// <term>LINGER</term>
/// <term>Lingers on close if unsent data is present.</term>
/// </item>
/// <item>
/// <term>SO_OOBINLINE</term>
/// <term>BOOL</term>
/// <term>
/// Indicates that out-of-bound data should be returned in-line with regular data. This option is only valid for connection-oriented
/// protocols that support out-of-band data. For a discussion of this topic, see Protocol Independent Out-Of-band Data.
/// </term>
/// </item>
/// <item>
/// <term>SO_RCVBUF</term>
/// <term>int</term>
/// <term>Specifies the total per-socket buffer space reserved for receives.</term>
/// </item>
/// <item>
/// <term>SO_REUSEADDR</term>
/// <term>BOOL</term>
/// <term>
/// Allows the socket to be bound to an address that is already in use. For more information, see bind. Not applicable on ATM sockets.
/// </term>
/// </item>
/// <item>
/// <term>SO_EXCLUSIVEADDRUSE</term>
/// <term>BOOL</term>
/// <term>Enables a socket to be bound for exclusive access. Does not require administrative privilege.</term>
/// </item>
/// <item>
/// <term>SO_RCVTIMEO</term>
/// <term>DWORD</term>
/// <term>Sets the timeout, in milliseconds, for blocking receive calls.</term>
/// </item>
/// <item>
/// <term>SO_SNDBUF</term>
/// <term>int</term>
/// <term>Specifies the total per-socket buffer space reserved for sends.</term>
/// </item>
/// <item>
/// <term>SO_SNDTIMEO</term>
/// <term>DWORD</term>
/// <term>The timeout, in milliseconds, for blocking send calls.</term>
/// </item>
/// <item>
/// <term>SO_UPDATE_ACCEPT_CONTEXT</term>
/// <term>int</term>
/// <term>Updates the accepting socket with the context of the listening socket.</term>
/// </item>
/// <item>
/// <term>PVD_CONFIG</term>
/// <term>Service Provider Dependent</term>
/// <term>
/// This object stores the configuration information for the service provider associated with socket s. The exact format of this
/// data structure is service provider specific.
/// </term>
/// </item>
/// </list>
/// <para>For more complete and detailed information about socket options for level = <c>SOL_SOCKET</c>, see SOL_SOCKET Socket Options.</para>
/// <para>level = <c>IPPROTO_TCP</c></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>TCP_NODELAY</term>
/// <term>BOOL</term>
/// <term>
/// Disables the Nagle algorithm for send coalescing.This socket option is included for backward compatibility with Windows Sockets 1.1
/// </term>
/// </item>
/// </list>
/// <para>
/// For more complete and detailed information about socket options for level = <c>IPPROTO_TCP</c>, see IPPROTO_TCP Socket Options.
/// </para>
/// <para>level = <c>NSPROTO_IPX</c></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>IPX_PTYPE</term>
/// <term>int</term>
/// <term>Sets the IPX packet type.</term>
/// </item>
/// <item>
/// <term>IPX_FILTERPTYPE</term>
/// <term>int</term>
/// <term>Sets the receive filter packet type</term>
/// </item>
/// <item>
/// <term>IPX_STOPFILTERPTYPE</term>
/// <term>int</term>
/// <term>Stops filtering the filter type set with IPX_FILTERTYPE</term>
/// </item>
/// <item>
/// <term>IPX_DSTYPE</term>
/// <term>int</term>
/// <term>Sets the value of the data stream field in the SPX header on every packet sent.</term>
/// </item>
/// <item>
/// <term>IPX_EXTENDED_ADDRESS</term>
/// <term>BOOL</term>
/// <term>Sets whether extended addressing is enabled.</term>
/// </item>
/// <item>
/// <term>IPX_RECVHDR</term>
/// <term>BOOL</term>
/// <term>Sets whether the protocol header is sent up on all receive headers.</term>
/// </item>
/// <item>
/// <term>IPX_RECEIVE_BROADCAST</term>
/// <term>BOOL</term>
/// <term>
/// Indicates broadcast packets are likely on the socket. Set to TRUE by default. Applications that do not use broadcasts should set
/// this to FALSE for better system performance.
/// </term>
/// </item>
/// <item>
/// <term>IPX_IMMEDIATESPXACK</term>
/// <term>BOOL</term>
/// <term>
/// Directs SPX connections not to delay before sending an ACK. Applications without back-and-forth traffic should set this to TRUE
/// to increase performance.
/// </term>
/// </item>
/// </list>
/// <para>
/// For more complete and detailed information about socket options for level = <c>NSPROTO_IPX</c>, see NSPROTO_IPX Socket Options.
/// </para>
/// <para>BSD options not supported for <c>setsockopt</c> are shown in the following table.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>SO_ACCEPTCONN</term>
/// <term>BOOL</term>
/// <term>
/// Returns whether a socket is in listening mode. This option is only Valid for connection-oriented protocols. This socket option
/// is not supported for the setting.
/// </term>
/// </item>
/// <item>
/// <term>SO_RCVLOWAT</term>
/// <term>int</term>
/// <term>
/// A socket option from BSD UNIX included for backward compatibility. This option sets the minimum number of bytes to process for
/// socket input operations.
/// </term>
/// </item>
/// <item>
/// <term>SO_SNDLOWAT</term>
/// <term>int</term>
/// <term>
/// A socket option from BSD UNIX included for backward compatibility. This option sets the minimum number of bytes to process for
/// socket output operations.
/// </term>
/// </item>
/// <item>
/// <term>SO_TYPE</term>
/// <term>int</term>
/// <term>
/// Returns the socket type for the given socket (SOCK_STREAM or SOCK_DGRAM, for example This socket option is not supported for the
/// setting the socket type.
/// </term>
/// </item>
/// </list>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>setsockopt</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Example Code</para>
/// <para>The following example demonstrates the <c>setsockopt</c> function.</para>
/// <para>Notes for IrDA Sockets</para>
/// <para>When developing applications using Windows sockets for IrDA, note the following:</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>IrDA provides the following socket option:</term>
/// </item>
/// </list>
/// <para>
/// The IRLMP_IAS_SET socket option enables the application to set a single attribute of a single class in the local IAS. The
/// application specifies the class to set, the attribute, and attribute type. The application is expected to allocate a buffer of
/// the necessary size for the passed parameters.
/// </para>
/// <para>
/// IrDA provides an IAS database that stores IrDA-based information. Limited access to the IAS database is available through the
/// Windows Sockets 2 interface, but such access is not normally used by applications, and exists primarily to support connections
/// to non-Windows devices that are not compliant with the Windows Sockets 2 IrDA conventions.
/// </para>
/// <para>The following structure, <c>IAS_SET</c>, is used with the IRLMP_IAS_SET setsockopt option to manage the local IAS database:</para>
/// <para>The following structure, <c>IAS_QUERY</c>, is used with the IRLMP_IAS_QUERY setsockopt option to query a peer's IAS database:</para>
/// <para>Many SO_ level socket options are not meaningful to IrDA. Only SO_LINGER is specifically supported.</para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-setsockopt int setsockopt( SOCKET s, int level, int
// optname, const char *optval, int optlen );
[PInvokeData("winsock.h", MSDNShortId = "3a6960c9-0c04-4403-aee1-ce250459dc30")]
public static WSRESULT setsockopt<TLvl, TIn>(SOCKET s, TLvl level, int optname, in TIn optval) where TIn : struct where TLvl : IConvertible
2022-07-05 22:19:30 -04:00
{
using var mem = SafeCoTaskMemHandle.CreateFromStructure(optval);
return setsockopt(s, level.ToInt32(null), optname, mem, mem.Size);
}
/// <summary>The <c>shutdown</c> function disables sends or receives on a socket.</summary>
/// <param name="s">A descriptor identifying a socket.</param>
/// <param name="how">
/// <para>
/// A flag that describes what types of operation will no longer be allowed. Possible values for this flag are listed in the
/// Winsock2.h header file.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>SD_RECEIVE 0</term>
/// <term>Shutdown receive operations.</term>
/// </item>
/// <item>
/// <term>SD_SEND 1</term>
/// <term>Shutdown send operations.</term>
/// </item>
/// <item>
/// <term>SD_BOTH 2</term>
/// <term>Shutdown both send and receive operations.</term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>shutdown</c> returns zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can
/// be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSAECONNABORTED</term>
/// <term>
/// The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no
/// longer usable. This error applies only to a connection-oriented socket.
/// </term>
/// </item>
/// <item>
/// <term>WSAECONNRESET</term>
/// <term>
/// The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket as
/// it is no longer usable. This error applies only to a connection-oriented socket.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// The how parameter is not valid, or is not consistent with the socket type. For example, SD_SEND is used with a UNI_RECV socket type.
/// </term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem has failed.</term>
/// </item>
/// <item>
/// <term>WSAENOTCONN</term>
/// <term>The socket is not connected. This error applies only to a connection-oriented socket.</term>
/// </item>
/// <item>
/// <term>WSAENOTSOCK</term>
/// <term/>
/// </item>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>shutdown</c> function is used on all types of sockets to disable reception, transmission, or both.</para>
/// <para>
/// If the how parameter is SD_RECEIVE, subsequent calls to the recv function on the socket will be disallowed. This has no effect
/// on the lower protocol layers. For TCP sockets, if there is still data queued on the socket waiting to be received, or data
/// arrives subsequently, the connection is reset, since the data cannot be delivered to the user. For UDP sockets, incoming
/// datagrams are accepted and queued. In no case will an ICMP error packet be generated.
/// </para>
/// <para>
/// If the how parameter is SD_SEND, subsequent calls to the send function are disallowed. For TCP sockets, a FIN will be sent after
/// all data is sent and acknowledged by the receiver.
/// </para>
/// <para>Setting how to SD_BOTH disables both sends and receives as described above.</para>
/// <para>
/// The <c>shutdown</c> function does not close the socket. Any resources attached to the socket will not be freed until closesocket
/// is invoked.
/// </para>
/// <para>
/// To assure that all data is sent and received on a connected socket before it is closed, an application should use
/// <c>shutdown</c> to close connection before calling closesocket. One method to wait for notification that the remote end has sent
/// all its data and initiated a graceful disconnect uses the WSAEventSelect function as follows :
/// </para>
/// <list type="number">
/// <item>
/// <term>Call WSAEventSelect to register for FD_CLOSE notification.</term>
/// </item>
/// <item>
/// <term>Call <c>shutdown</c> with how=SD_SEND.</term>
/// </item>
/// <item>
/// <term>
/// When FD_CLOSE received, call the recv or WSARecv until the function completes with success and indicates that zero bytes were
/// received. If SOCKET_ERROR is returned, then the graceful disconnect is not possible.
/// </term>
/// </item>
/// <item>
/// <term>Call closesocket.</term>
/// </item>
/// </list>
/// <para>
/// Another method to wait for notification that the remote end has sent all its data and initiated a graceful disconnect uses
/// overlapped receive calls follows :
/// </para>
/// <list type="number">
/// <item>
/// <term>Call <c>shutdown</c> with how=SD_SEND.</term>
/// </item>
/// <item>
/// <term>
/// Call recv or WSARecv until the function completes with success and indicates zero bytes were received. If SOCKET_ERROR is
/// returned, then the graceful disconnect is not possible.
/// </term>
/// </item>
/// <item>
/// <term>Call closesocket.</term>
/// </item>
/// </list>
/// <para><c>Note</c> The <c>shutdown</c> function does not block regardless of the SO_LINGER setting on the socket.</para>
/// <para>For more information, see the section on Graceful Shutdown, Linger Options, and Socket Closure.</para>
/// <para>
/// Once the <c>shutdown</c> function is called to disable send, receive, or both, there is no method to re-enable send or receive
/// for the existing socket connection.
/// </para>
/// <para>
/// An application should not rely on being able to reuse a socket after it has been shut down. In particular, a Windows Sockets
/// provider is not required to support the use of connect on a socket that has been shut down.
/// </para>
/// <para>
/// If an application wants to reuse a socket, then the DisconnectEx function should be called with the dwFlags parameter set to
/// <c>TF_REUSE_SOCKET</c> to close a connection on a socket and prepare the socket handle to be reused. When the
/// <c>DisconnectEx</c> request completes, the socket handle can be passed to the AcceptEx or ConnectEx function.
/// </para>
/// <para>
/// If an application wants to reuse a socket, the TransmitFile or TransmitPackets functions can be called with the dwFlags
/// parameter set with <c>TF_DISCONNECT</c> and <c>TF_REUSE_SOCKET</c> to disconnect after all the data has been queued for
/// transmission and prepare the socket handle to be reused. When the <c>TransmitFile</c> request completes, the socket handle can
/// be passed to the function call previously used to establish the connection, such as AcceptEx or ConnectEx. When the
/// <c>TransmitPackets</c> function completes, the socket handle can be passed to the <c>AcceptEx</c> function.
/// </para>
/// <para>
/// <c>Note</c> The socket level disconnect is subject to the behavior of the underlying transport. For example, a TCP socket may be
/// subject to the TCP TIME_WAIT state, causing the DisconnectEx, TransmitFile, or TransmitPackets call to be delayed.
/// </para>
/// <para>
/// <c>Note</c> When issuing a blocking Winsock call such as <c>shutdown</c>, Winsock may need to wait for a network event before
/// the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous
/// procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an
/// ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
/// </para>
/// <para>Notes for ATM</para>
/// <para>
/// There are important issues associated with connection teardown when using Asynchronous Transfer Mode (ATM) and Windows Sockets
/// 2. For more information about these important considerations, see the section titled Notes for ATM in the Remarks section of the
/// closesocket function reference.
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-shutdown int shutdown( SOCKET s, int how );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock.h", MSDNShortId = "6998f0c6-adc9-481f-b9fb-75f9c9f5caaf")]
public static extern WSRESULT shutdown(SOCKET s, SD how);
/// <summary>The <c>socket</c> function creates a socket that is bound to a specific transport service provider.</summary>
/// <param name="af">
/// <para>The address family specification. Possible values for the address family are defined in the Winsock2.h header file.</para>
/// <para>
/// On the Windows SDK released for Windows Vista and later, the organization of header files has changed and the possible values
/// for the address family are defined in the Ws2def.h header file. Note that the Ws2def.h header file is automatically included in
/// Winsock2.h, and should never be used directly.
/// </para>
/// <para>
/// The values currently supported are AF_INET or AF_INET6, which are the Internet address family formats for IPv4 and IPv6. Other
/// options for address family (AF_NETBIOS for use with NetBIOS, for example) are supported if a Windows Sockets service provider
/// for the address family is installed. Note that the values for the AF_ address family and PF_ protocol family constants are
/// identical (for example, <c>AF_INET</c> and <c>PF_INET</c>), so either constant can be used.
/// </para>
/// <para>The table below lists common values for address family although many other values are possible.</para>
/// <list type="table">
/// <listheader>
/// <term>Af</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>AF_UNSPEC 0</term>
/// <term>The address family is unspecified.</term>
/// </item>
/// <item>
/// <term>AF_INET 2</term>
/// <term>The Internet Protocol version 4 (IPv4) address family.</term>
/// </item>
/// <item>
/// <term>AF_IPX 6</term>
/// <term>
/// The IPX/SPX address family. This address family is only supported if the NWLink IPX/SPX NetBIOS Compatible Transport protocol is
/// installed. This address family is not supported on Windows Vista and later.
/// </term>
/// </item>
/// <item>
/// <term>AF_APPLETALK 16</term>
/// <term>
/// The AppleTalk address family. This address family is only supported if the AppleTalk protocol is installed. This address family
/// is not supported on Windows Vista and later.
/// </term>
/// </item>
/// <item>
/// <term>AF_NETBIOS 17</term>
/// <term>
/// The NetBIOS address family. This address family is only supported if the Windows Sockets provider for NetBIOS is installed. The
/// Windows Sockets provider for NetBIOS is supported on 32-bit versions of Windows. This provider is installed by default on 32-bit
/// versions of Windows. The Windows Sockets provider for NetBIOS is not supported on 64-bit versions of windows including Windows
/// 7, Windows Server 2008, Windows Vista, Windows Server 2003, or Windows XP. The Windows Sockets provider for NetBIOS only
/// supports sockets where the type parameter is set to SOCK_DGRAM. The Windows Sockets provider for NetBIOS is not directly related
/// to the NetBIOS programming interface. The NetBIOS programming interface is not supported on Windows Vista, Windows Server 2008,
/// and later.
/// </term>
/// </item>
/// <item>
/// <term>AF_INET6 23</term>
/// <term>The Internet Protocol version 6 (IPv6) address family.</term>
/// </item>
/// <item>
/// <term>AF_IRDA 26</term>
/// <term>
/// The Infrared Data Association (IrDA) address family. This address family is only supported if the computer has an infrared port
/// and driver installed.
/// </term>
/// </item>
/// <item>
/// <term>AF_BTH 32</term>
/// <term>
/// The Bluetooth address family. This address family is supported on Windows XP with SP2 or later if the computer has a Bluetooth
/// adapter and driver installed.
/// </term>
/// </item>
/// </list>
/// </param>
/// <param name="type">
/// <para>The type specification for the new socket.</para>
/// <para>Possible values for the socket type are defined in the Winsock2.h header file.</para>
/// <para>The following table lists the possible values for the type parameter supported for Windows Sockets 2:</para>
/// <list type="table">
/// <listheader>
/// <term>Type</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>SOCK_STREAM 1</term>
/// <term>
/// A socket type that provides sequenced, reliable, two-way, connection-based byte streams with an OOB data transmission mechanism.
/// This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6).
/// </term>
/// </item>
/// <item>
/// <term>SOCK_DGRAM 2</term>
/// <term>
/// A socket type that supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length.
/// This socket type uses the User Datagram Protocol (UDP) for the Internet address family (AF_INET or AF_INET6).
/// </term>
/// </item>
/// <item>
/// <term>SOCK_RAW 3</term>
/// <term>
/// A socket type that provides a raw socket that allows an application to manipulate the next upper-layer protocol header. To
/// manipulate the IPv4 header, the IP_HDRINCL socket option must be set on the socket. To manipulate the IPv6 header, the
/// IPV6_HDRINCL socket option must be set on the socket.
/// </term>
/// </item>
/// <item>
/// <term>SOCK_RDM 4</term>
/// <term>
/// A socket type that provides a reliable message datagram. An example of this type is the Pragmatic General Multicast (PGM)
/// multicast protocol implementation in Windows, often referred to as reliable multicast programming. This type value is only
/// supported if the Reliable Multicast Protocol is installed.
/// </term>
/// </item>
/// <item>
/// <term>SOCK_SEQPACKET 5</term>
/// <term>A socket type that provides a pseudo-stream packet based on datagrams.</term>
/// </item>
/// </list>
/// <para>
/// In Windows Sockets 2, new socket types were introduced. An application can dynamically discover the attributes of each available
/// transport protocol through the WSAEnumProtocols function. So an application can determine the possible socket type and protocol
/// options for an address family and use this information when specifying this parameter. Socket type definitions in the Winsock2.h
/// and Ws2def.h header files will be periodically updated as new socket types, address families, and protocols are defined.
/// </para>
/// <para>In Windows Sockets 1.1, the only possible socket types are <c>SOCK_DGRAM</c> and <c>SOCK_STREAM</c>.</para>
/// </param>
/// <param name="protocol">
/// <para>
/// The protocol to be used. The possible options for the protocol parameter are specific to the address family and socket type
/// specified. Possible values for the protocol are defined in the Winsock2.h and Wsrm.h header files.
/// </para>
/// <para>
/// On the Windows SDK released for Windows Vista and later, the organization of header files has changed and this parameter can be
/// one of the values from the <c>IPPROTO</c> enumeration type defined in the Ws2def.h header file. Note that the Ws2def.h header
/// file is automatically included in Winsock2.h, and should never be used directly.
/// </para>
/// <para>
/// If a value of 0 is specified, the caller does not wish to specify a protocol and the service provider will choose the protocol
/// to use.
/// </para>
/// <para>
/// When the af parameter is AF_INET or AF_INET6 and the type is <c>SOCK_RAW</c>, the value specified for the protocol is set in the
/// protocol field of the IPv6 or IPv4 packet header.
/// </para>
/// <para>The table below lists common values for the protocol although many other values are possible.</para>
/// <list type="table">
/// <listheader>
/// <term>protocol</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>IPPROTO_ICMP 1</term>
/// <term>
/// The Internet Control Message Protocol (ICMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6
/// and the type parameter is SOCK_RAW or unspecified. This protocol value is supported on Windows XP and later.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_IGMP 2</term>
/// <term>
/// The Internet Group Management Protocol (IGMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6
/// and the type parameter is SOCK_RAW or unspecified. This protocol value is supported on Windows XP and later.
/// </term>
/// </item>
/// <item>
/// <term>BTHPROTO_RFCOMM 3</term>
/// <term>
/// The Bluetooth Radio Frequency Communications (Bluetooth RFCOMM) protocol. This is a possible value when the af parameter is
/// AF_BTH and the type parameter is SOCK_STREAM. This protocol value is supported on Windows XP with SP2 or later.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_TCP 6</term>
/// <term>
/// The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type
/// parameter is SOCK_STREAM.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_UDP 17</term>
/// <term>
/// The User Datagram Protocol (UDP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter
/// is SOCK_DGRAM.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_ICMPV6 58</term>
/// <term>
/// The Internet Control Message Protocol Version 6 (ICMPv6). This is a possible value when the af parameter is AF_UNSPEC, AF_INET,
/// or AF_INET6 and the type parameter is SOCK_RAW or unspecified. This protocol value is supported on Windows XP and later.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_RM 113</term>
/// <term>
/// The PGM protocol for reliable multicast. This is a possible value when the af parameter is AF_INET and the type parameter is
/// SOCK_RDM. On the Windows SDK released for Windows Vista and later, this protocol is also called IPPROTO_PGM. This protocol value
/// is only supported if the Reliable Multicast Protocol is installed.
/// </term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>socket</c> returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is
/// returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem or the associated service provider has failed.</term>
/// </item>
/// <item>
/// <term>WSAEAFNOSUPPORT</term>
/// <term>
/// The specified address family is not supported. For example, an application tried to create a socket for the AF_IRDA address
/// family but an infrared adapter and device driver is not installed on the local computer.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEMFILE</term>
/// <term>No more socket descriptors are available.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// An invalid argument was supplied. This error is returned if the af parameter is set to AF_UNSPEC and the type and protocol
/// parameter are unspecified.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINVALIDPROVIDER</term>
/// <term>The service provider returned a version other than 2.2.</term>
/// </item>
/// <item>
/// <term>WSAEINVALIDPROCTABLE</term>
/// <term>The service provider returned an invalid or incomplete procedure table to the WSPStartup.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available. The socket cannot be created.</term>
/// </item>
/// <item>
/// <term>WSAEPROTONOSUPPORT</term>
/// <term>The specified protocol is not supported.</term>
/// </item>
/// <item>
/// <term>WSAEPROTOTYPE</term>
/// <term>The specified protocol is the wrong type for this socket.</term>
/// </item>
/// <item>
/// <term>WSAEPROVIDERFAILEDINIT</term>
/// <term>
/// The service provider failed to initialize. This error is returned if a layered service provider (LSP) or namespace provider was
/// improperly installed or the provider fails to operate correctly.
/// </term>
/// </item>
/// <item>
/// <term>WSAESOCKTNOSUPPORT</term>
/// <term>The specified socket type is not supported in this address family.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>socket</c> function causes a socket descriptor and any related resources to be allocated and bound to a specific
/// transport-service provider. Winsock will utilize the first available service provider that supports the requested combination of
/// address family, socket type and protocol parameters. The socket that is created will have the overlapped attribute as a default.
/// For Windows, the Microsoft-specific socket option, SO_OPENTYPE, defined in Mswsock.h can affect this default. See
/// Microsoft-specific documentation for a detailed description of SO_OPENTYPE.
/// </para>
/// <para>
/// Sockets without the overlapped attribute can be created by using WSASocket. All functions that allow overlapped operation
/// (WSASend, WSARecv, WSASendTo, WSARecvFrom, and WSAIoctl) also support nonoverlapped usage on an overlapped socket if the values
/// for parameters related to overlapped operation are <c>NULL</c>.
/// </para>
/// <para>
/// When selecting a protocol and its supporting service provider this procedure will only choose a base protocol or a protocol
/// chain, not a protocol layer by itself. Unchained protocol layers are not considered to have partial matches on type or af
/// either. That is, they do not lead to an error code of WSAEAFNOSUPPORT or WSAEPROTONOSUPPORT if no suitable protocol is found.
/// </para>
/// <para>
/// <c>Note</c> The manifest constant <c>AF_UNSPEC</c> continues to be defined in the header file but its use is strongly
/// discouraged, as this can cause ambiguity in interpreting the value of the protocol parameter.
/// </para>
/// <para>
/// Applications are encouraged to use <c>AF_INET6</c> for the af parameter and create a dual-mode socket that can be used with both
/// IPv4 and IPv6.
/// </para>
/// <para>
/// Connection-oriented sockets such as <c>SOCK_STREAM</c> provide full-duplex connections, and must be in a connected state before
/// any data can be sent or received on it. A connection to another socket is created with a connect call. Once connected, data can
/// be transferred using send and recv calls. When a session has been completed, a closesocket must be performed.
/// </para>
/// <para>
/// The communications protocols used to implement a reliable, connection-oriented socket ensure that data is not lost or
/// duplicated. If data for which the peer protocol has buffer space cannot be successfully transmitted within a reasonable length
/// of time, the connection is considered broken and subsequent calls will fail with the error code set to WSAETIMEDOUT.
/// </para>
/// <para>
/// Connectionless, message-oriented sockets allow sending and receiving of datagrams to and from arbitrary peers using sendto and
/// recvfrom. If such a socket is connected to a specific peer, datagrams can be sent to that peer using send and can be received
/// only from this peer using recv.
/// </para>
/// <para>
/// IPv6 and IPv4 operate differently when receiving a socket with a type of <c>SOCK_RAW</c>. The IPv4 receive packet includes the
/// packet payload, the next upper-level header (for example, the IP header for a TCP or UDP packet), and the IPv4 packet header.
/// The IPv6 receive packet includes the packet payload and the next upper-level header. The IPv6 receive packet never includes the
/// IPv6 packet header.
/// </para>
/// <para><c>Note</c> On Windows NT, raw socket support requires administrative privileges.</para>
/// <para>
/// A socket with a type parameter of <c>SOCK_SEQPACKET</c> is based on datagrams, but functions as a pseudo-stream protocol. For
/// both send and receive packets, separate datagrams are used. However, Windows Sockets can coalesce multiple receive packets into
/// a single packet. So an application can issue a receive call (for example, recv or WSARecvEx) and retrieve the data from several
/// coalesced multiple packets in single call. The AF_NETBIOS address family supports a type parameter of <c>SOCK_SEQPACKET</c>.
/// </para>
/// <para>
/// When the af parameter is <c>AF_NETBIOS</c> for NetBIOS over TCP/IP, the type parameter can be <c>SOCK_DGRAM</c> or
/// <c>SOCK_SEQPACKET</c>. For the <c>AF_NETBIOS</c> address family, the protocol parameter is the LAN adapter number represented as
/// a negative number.
/// </para>
/// <para>
/// On Windows XP and later, the following command can be used to list the Windows Sockets catalog to determine the service
/// providers installed and the address family, socket type, and protocols that are supported.
/// </para>
/// <para><c>netsh winsock show catalog</c></para>
/// <para>
/// Support for sockets with type <c>SOCK_RAW</c> is not required, but service providers are encouraged to support raw sockets as practicable.
/// </para>
/// <para>Notes for IrDA Sockets</para>
/// <para>Keep the following in mind:</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>Only <c>SOCK_STREAM</c> is supported; the <c>SOCK_DGRAM</c> type is not supported by IrDA.</term>
/// </item>
/// <item>
/// <term>The protocol parameter is always set to 0 for IrDA.</term>
/// </item>
/// </list>
/// <para>
/// A socket for use with the AF_IRDA address family can only be created if the local computer has an infrared port and driver
/// installed. Otherwise, a call to the <c>socket</c> function with af parameter set to AF_IRDA will fail and WSAGetLastError
/// returns WSAEPROTONOSUPPORT.
/// </para>
/// <para>Example Code</para>
/// <para>
/// The following example demonstrates the use of the <c>socket</c> function to create a socket that is bound to a specific
/// transport service provider..
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-socket SOCKET WSAAPI socket( int af, int type, int
// protocol );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "6bf6e6c4-6268-479c-86a6-52e90cf317db")]
public static extern SafeSOCKET socket(ADDRESS_FAMILY af, SOCK type, IPPROTO protocol);
/// <summary>The <c>socket</c> function creates a socket that is bound to a specific transport service provider.</summary>
/// <param name="af">
/// <para>The address family specification. Possible values for the address family are defined in the Winsock2.h header file.</para>
/// <para>
/// On the Windows SDK released for Windows Vista and later, the organization of header files has changed and the possible values
/// for the address family are defined in the Ws2def.h header file. Note that the Ws2def.h header file is automatically included in
/// Winsock2.h, and should never be used directly.
/// </para>
/// <para>
/// The values currently supported are AF_INET or AF_INET6, which are the Internet address family formats for IPv4 and IPv6. Other
/// options for address family (AF_NETBIOS for use with NetBIOS, for example) are supported if a Windows Sockets service provider
/// for the address family is installed. Note that the values for the AF_ address family and PF_ protocol family constants are
/// identical (for example, <c>AF_INET</c> and <c>PF_INET</c>), so either constant can be used.
/// </para>
/// <para>The table below lists common values for address family although many other values are possible.</para>
/// <list type="table">
/// <listheader>
/// <term>Af</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>AF_UNSPEC 0</term>
/// <term>The address family is unspecified.</term>
/// </item>
/// <item>
/// <term>AF_INET 2</term>
/// <term>The Internet Protocol version 4 (IPv4) address family.</term>
/// </item>
/// <item>
/// <term>AF_IPX 6</term>
/// <term>
/// The IPX/SPX address family. This address family is only supported if the NWLink IPX/SPX NetBIOS Compatible Transport protocol is
/// installed. This address family is not supported on Windows Vista and later.
/// </term>
/// </item>
/// <item>
/// <term>AF_APPLETALK 16</term>
/// <term>
/// The AppleTalk address family. This address family is only supported if the AppleTalk protocol is installed. This address family
/// is not supported on Windows Vista and later.
/// </term>
/// </item>
/// <item>
/// <term>AF_NETBIOS 17</term>
/// <term>
/// The NetBIOS address family. This address family is only supported if the Windows Sockets provider for NetBIOS is installed. The
/// Windows Sockets provider for NetBIOS is supported on 32-bit versions of Windows. This provider is installed by default on 32-bit
/// versions of Windows. The Windows Sockets provider for NetBIOS is not supported on 64-bit versions of windows including Windows
/// 7, Windows Server 2008, Windows Vista, Windows Server 2003, or Windows XP. The Windows Sockets provider for NetBIOS only
/// supports sockets where the type parameter is set to SOCK_DGRAM. The Windows Sockets provider for NetBIOS is not directly related
/// to the NetBIOS programming interface. The NetBIOS programming interface is not supported on Windows Vista, Windows Server 2008,
/// and later.
/// </term>
/// </item>
/// <item>
/// <term>AF_INET6 23</term>
/// <term>The Internet Protocol version 6 (IPv6) address family.</term>
/// </item>
/// <item>
/// <term>AF_IRDA 26</term>
/// <term>
/// The Infrared Data Association (IrDA) address family. This address family is only supported if the computer has an infrared port
/// and driver installed.
/// </term>
/// </item>
/// <item>
/// <term>AF_BTH 32</term>
/// <term>
/// The Bluetooth address family. This address family is supported on Windows XP with SP2 or later if the computer has a Bluetooth
/// adapter and driver installed.
/// </term>
/// </item>
/// </list>
/// </param>
/// <param name="type">
/// <para>The type specification for the new socket.</para>
/// <para>Possible values for the socket type are defined in the Winsock2.h header file.</para>
/// <para>The following table lists the possible values for the type parameter supported for Windows Sockets 2:</para>
/// <list type="table">
/// <listheader>
/// <term>Type</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>SOCK_STREAM 1</term>
/// <term>
/// A socket type that provides sequenced, reliable, two-way, connection-based byte streams with an OOB data transmission mechanism.
/// This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6).
/// </term>
/// </item>
/// <item>
/// <term>SOCK_DGRAM 2</term>
/// <term>
/// A socket type that supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length.
/// This socket type uses the User Datagram Protocol (UDP) for the Internet address family (AF_INET or AF_INET6).
/// </term>
/// </item>
/// <item>
/// <term>SOCK_RAW 3</term>
/// <term>
/// A socket type that provides a raw socket that allows an application to manipulate the next upper-layer protocol header. To
/// manipulate the IPv4 header, the IP_HDRINCL socket option must be set on the socket. To manipulate the IPv6 header, the
/// IPV6_HDRINCL socket option must be set on the socket.
/// </term>
/// </item>
/// <item>
/// <term>SOCK_RDM 4</term>
/// <term>
/// A socket type that provides a reliable message datagram. An example of this type is the Pragmatic General Multicast (PGM)
/// multicast protocol implementation in Windows, often referred to as reliable multicast programming. This type value is only
/// supported if the Reliable Multicast Protocol is installed.
/// </term>
/// </item>
/// <item>
/// <term>SOCK_SEQPACKET 5</term>
/// <term>A socket type that provides a pseudo-stream packet based on datagrams.</term>
/// </item>
/// </list>
/// <para>
/// In Windows Sockets 2, new socket types were introduced. An application can dynamically discover the attributes of each available
/// transport protocol through the WSAEnumProtocols function. So an application can determine the possible socket type and protocol
/// options for an address family and use this information when specifying this parameter. Socket type definitions in the Winsock2.h
/// and Ws2def.h header files will be periodically updated as new socket types, address families, and protocols are defined.
/// </para>
/// <para>In Windows Sockets 1.1, the only possible socket types are <c>SOCK_DGRAM</c> and <c>SOCK_STREAM</c>.</para>
/// </param>
/// <param name="protocol">
/// <para>
/// The protocol to be used. The possible options for the protocol parameter are specific to the address family and socket type
/// specified. Possible values for the protocol are defined in the Winsock2.h and Wsrm.h header files.
/// </para>
/// <para>
/// On the Windows SDK released for Windows Vista and later, the organization of header files has changed and this parameter can be
/// one of the values from the <c>IPPROTO</c> enumeration type defined in the Ws2def.h header file. Note that the Ws2def.h header
/// file is automatically included in Winsock2.h, and should never be used directly.
/// </para>
/// <para>
/// If a value of 0 is specified, the caller does not wish to specify a protocol and the service provider will choose the protocol
/// to use.
/// </para>
/// <para>
/// When the af parameter is AF_INET or AF_INET6 and the type is <c>SOCK_RAW</c>, the value specified for the protocol is set in the
/// protocol field of the IPv6 or IPv4 packet header.
/// </para>
/// <para>The table below lists common values for the protocol although many other values are possible.</para>
/// <list type="table">
/// <listheader>
/// <term>protocol</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>IPPROTO_ICMP 1</term>
/// <term>
/// The Internet Control Message Protocol (ICMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6
/// and the type parameter is SOCK_RAW or unspecified. This protocol value is supported on Windows XP and later.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_IGMP 2</term>
/// <term>
/// The Internet Group Management Protocol (IGMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6
/// and the type parameter is SOCK_RAW or unspecified. This protocol value is supported on Windows XP and later.
/// </term>
/// </item>
/// <item>
/// <term>BTHPROTO_RFCOMM 3</term>
/// <term>
/// The Bluetooth Radio Frequency Communications (Bluetooth RFCOMM) protocol. This is a possible value when the af parameter is
/// AF_BTH and the type parameter is SOCK_STREAM. This protocol value is supported on Windows XP with SP2 or later.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_TCP 6</term>
/// <term>
/// The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type
/// parameter is SOCK_STREAM.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_UDP 17</term>
/// <term>
/// The User Datagram Protocol (UDP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter
/// is SOCK_DGRAM.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_ICMPV6 58</term>
/// <term>
/// The Internet Control Message Protocol Version 6 (ICMPv6). This is a possible value when the af parameter is AF_UNSPEC, AF_INET,
/// or AF_INET6 and the type parameter is SOCK_RAW or unspecified. This protocol value is supported on Windows XP and later.
/// </term>
/// </item>
/// <item>
/// <term>IPPROTO_RM 113</term>
/// <term>
/// The PGM protocol for reliable multicast. This is a possible value when the af parameter is AF_INET and the type parameter is
/// SOCK_RDM. On the Windows SDK released for Windows Vista and later, this protocol is also called IPPROTO_PGM. This protocol value
/// is only supported if the Reliable Multicast Protocol is installed.
/// </term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>
/// If no error occurs, <c>socket</c> returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is
/// returned, and a specific error code can be retrieved by calling WSAGetLastError.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Error code</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WSANOTINITIALISED</term>
/// <term>A successful WSAStartup call must occur before using this function.</term>
/// </item>
/// <item>
/// <term>WSAENETDOWN</term>
/// <term>The network subsystem or the associated service provider has failed.</term>
/// </item>
/// <item>
/// <term>WSAEAFNOSUPPORT</term>
/// <term>
/// The specified address family is not supported. For example, an application tried to create a socket for the AF_IRDA address
/// family but an infrared adapter and device driver is not installed on the local computer.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINPROGRESS</term>
/// <term>A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.</term>
/// </item>
/// <item>
/// <term>WSAEMFILE</term>
/// <term>No more socket descriptors are available.</term>
/// </item>
/// <item>
/// <term>WSAEINVAL</term>
/// <term>
/// An invalid argument was supplied. This error is returned if the af parameter is set to AF_UNSPEC and the type and protocol
/// parameter are unspecified.
/// </term>
/// </item>
/// <item>
/// <term>WSAEINVALIDPROVIDER</term>
/// <term>The service provider returned a version other than 2.2.</term>
/// </item>
/// <item>
/// <term>WSAEINVALIDPROCTABLE</term>
/// <term>The service provider returned an invalid or incomplete procedure table to the WSPStartup.</term>
/// </item>
/// <item>
/// <term>WSAENOBUFS</term>
/// <term>No buffer space is available. The socket cannot be created.</term>
/// </item>
/// <item>
/// <term>WSAEPROTONOSUPPORT</term>
/// <term>The specified protocol is not supported.</term>
/// </item>
/// <item>
/// <term>WSAEPROTOTYPE</term>
/// <term>The specified protocol is the wrong type for this socket.</term>
/// </item>
/// <item>
/// <term>WSAEPROVIDERFAILEDINIT</term>
/// <term>
/// The service provider failed to initialize. This error is returned if a layered service provider (LSP) or namespace provider was
/// improperly installed or the provider fails to operate correctly.
/// </term>
/// </item>
/// <item>
/// <term>WSAESOCKTNOSUPPORT</term>
/// <term>The specified socket type is not supported in this address family.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>socket</c> function causes a socket descriptor and any related resources to be allocated and bound to a specific
/// transport-service provider. Winsock will utilize the first available service provider that supports the requested combination of
/// address family, socket type and protocol parameters. The socket that is created will have the overlapped attribute as a default.
/// For Windows, the Microsoft-specific socket option, SO_OPENTYPE, defined in Mswsock.h can affect this default. See
/// Microsoft-specific documentation for a detailed description of SO_OPENTYPE.
/// </para>
/// <para>
/// Sockets without the overlapped attribute can be created by using WSASocket. All functions that allow overlapped operation
/// (WSASend, WSARecv, WSASendTo, WSARecvFrom, and WSAIoctl) also support nonoverlapped usage on an overlapped socket if the values
/// for parameters related to overlapped operation are <c>NULL</c>.
/// </para>
/// <para>
/// When selecting a protocol and its supporting service provider this procedure will only choose a base protocol or a protocol
/// chain, not a protocol layer by itself. Unchained protocol layers are not considered to have partial matches on type or af
/// either. That is, they do not lead to an error code of WSAEAFNOSUPPORT or WSAEPROTONOSUPPORT if no suitable protocol is found.
/// </para>
/// <para>
/// <c>Note</c> The manifest constant <c>AF_UNSPEC</c> continues to be defined in the header file but its use is strongly
/// discouraged, as this can cause ambiguity in interpreting the value of the protocol parameter.
/// </para>
/// <para>
/// Applications are encouraged to use <c>AF_INET6</c> for the af parameter and create a dual-mode socket that can be used with both
/// IPv4 and IPv6.
/// </para>
/// <para>
/// Connection-oriented sockets such as <c>SOCK_STREAM</c> provide full-duplex connections, and must be in a connected state before
/// any data can be sent or received on it. A connection to another socket is created with a connect call. Once connected, data can
/// be transferred using send and recv calls. When a session has been completed, a closesocket must be performed.
/// </para>
/// <para>
/// The communications protocols used to implement a reliable, connection-oriented socket ensure that data is not lost or
/// duplicated. If data for which the peer protocol has buffer space cannot be successfully transmitted within a reasonable length
/// of time, the connection is considered broken and subsequent calls will fail with the error code set to WSAETIMEDOUT.
/// </para>
/// <para>
/// Connectionless, message-oriented sockets allow sending and receiving of datagrams to and from arbitrary peers using sendto and
/// recvfrom. If such a socket is connected to a specific peer, datagrams can be sent to that peer using send and can be received
/// only from this peer using recv.
/// </para>
/// <para>
/// IPv6 and IPv4 operate differently when receiving a socket with a type of <c>SOCK_RAW</c>. The IPv4 receive packet includes the
/// packet payload, the next upper-level header (for example, the IP header for a TCP or UDP packet), and the IPv4 packet header.
/// The IPv6 receive packet includes the packet payload and the next upper-level header. The IPv6 receive packet never includes the
/// IPv6 packet header.
/// </para>
/// <para><c>Note</c> On Windows NT, raw socket support requires administrative privileges.</para>
/// <para>
/// A socket with a type parameter of <c>SOCK_SEQPACKET</c> is based on datagrams, but functions as a pseudo-stream protocol. For
/// both send and receive packets, separate datagrams are used. However, Windows Sockets can coalesce multiple receive packets into
/// a single packet. So an application can issue a receive call (for example, recv or WSARecvEx) and retrieve the data from several
/// coalesced multiple packets in single call. The AF_NETBIOS address family supports a type parameter of <c>SOCK_SEQPACKET</c>.
/// </para>
/// <para>
/// When the af parameter is <c>AF_NETBIOS</c> for NetBIOS over TCP/IP, the type parameter can be <c>SOCK_DGRAM</c> or
/// <c>SOCK_SEQPACKET</c>. For the <c>AF_NETBIOS</c> address family, the protocol parameter is the LAN adapter number represented as
/// a negative number.
/// </para>
/// <para>
/// On Windows XP and later, the following command can be used to list the Windows Sockets catalog to determine the service
/// providers installed and the address family, socket type, and protocols that are supported.
/// </para>
/// <para><c>netsh winsock show catalog</c></para>
/// <para>
/// Support for sockets with type <c>SOCK_RAW</c> is not required, but service providers are encouraged to support raw sockets as practicable.
/// </para>
/// <para>Notes for IrDA Sockets</para>
/// <para>Keep the following in mind:</para>
/// <list type="bullet">
/// <item>
/// <term>The Af_irda.h header file must be explicitly included.</term>
/// </item>
/// <item>
/// <term>Only <c>SOCK_STREAM</c> is supported; the <c>SOCK_DGRAM</c> type is not supported by IrDA.</term>
/// </item>
/// <item>
/// <term>The protocol parameter is always set to 0 for IrDA.</term>
/// </item>
/// </list>
/// <para>
/// A socket for use with the AF_IRDA address family can only be created if the local computer has an infrared port and driver
/// installed. Otherwise, a call to the <c>socket</c> function with af parameter set to AF_IRDA will fail and WSAGetLastError
/// returns WSAEPROTONOSUPPORT.
/// </para>
/// <para>Example Code</para>
/// <para>
/// The following example demonstrates the use of the <c>socket</c> function to create a socket that is bound to a specific
/// transport service provider..
/// </para>
/// <para><c>Windows Phone 8:</c> This function is supported for Windows Phone Store apps on Windows Phone 8 and later.</para>
/// <para>
/// <c>Windows 8.1</c> and <c>Windows Server 2012 R2</c>: This function is supported for Windows Store apps on Windows 8.1, Windows
/// Server 2012 R2, and later.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-socket SOCKET WSAAPI socket( int af, int type, int
// protocol );
[DllImport(Lib.Ws2_32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winsock2.h", MSDNShortId = "6bf6e6c4-6268-479c-86a6-52e90cf317db")]
public static extern SafeSOCKET socket(ADDRESS_FAMILY af, SOCK type, uint protocol = 0U);
/// <summary>
/// The <c>protoent</c> structure contains the name and protocol numbers that correspond to a given protocol name. Applications must
/// never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is
/// allocated per thread, and therefore, the application should copy any information it needs before issuing any other Windows
/// Sockets function calls.
/// </summary>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-protoent typedef struct protoent { char *p_name; char
// **p_aliases; short p_proto; } PROTOENT, *PPROTOENT, *LPPROTOENT;
[PInvokeData("winsock.h", MSDNShortId = "8fc729dd-5a73-42a1-9c3f-adc68d83d863")]
[StructLayout(LayoutKind.Sequential)]
public struct PROTOENT
{
/// <summary>Official name of the protocol.</summary>
public StrPtrAnsi p_name;
/// <summary>Null-terminated array of alternate names.</summary>
public IntPtr p_aliases;
/// <summary>Protocol number, in host byte order.</summary>
public short p_proto;
/// <summary>Array of alternate names extracted from <see cref="p_aliases"/>.</summary>
public string[] Aliases => p_aliases.ToStringEnum(p_aliases.GetNulledPtrArrayLength(), CharSet.Ansi).ToArray();
}
/// <summary>The <c>servent</c> structure is used to store or return the name and service number for a given service name.</summary>
// https://docs.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-servent typedef struct servent { char *s_name; char
// **s_aliases; #if ... char *s_proto; #if ... short s_port; #else short s_port; #endif #else char *s_proto; #endif } SERVENT,
// *PSERVENT, *LPSERVENT;
[PInvokeData("winsock.h", MSDNShortId = "8696b854-4d37-4d1b-8383-169b5dc7a2ae")]
[VanaraMarshaler(typeof(SERVENT))]
public struct SERVENT : IVanaraMarshaler
{
/// <summary>The official name of the service.</summary>
public string s_name;
/// <summary>A <c>NULL</c>-terminated array of alternate names.</summary>
public string[] s_aliases;
/// <summary>The port number at which the service can be contacted. Port numbers are returned in network byte order.</summary>
public short s_port;
/// <summary>The name of the protocol to use when contacting the service.</summary>
public string s_proto;
/// <summary>Use this method to address different structure layouts on 64-bit systems.</summary>
/// <param name="ptr">The ptr to convert.</param>
/// <returns>A SERVENT structure aligned correctly.</returns>
public SERVENT FromIntPtr(IntPtr ptr)
{
if (IntPtr.Size == 8)
{
var x = ptr.ToStructure<SERVENTx64>();
return new SERVENT { s_name = x.s_name, s_aliases = x.s_aliases.ToStringEnum(x.s_aliases.GetNulledPtrArrayLength(), CharSet.Ansi).ToArray(), s_port = x.s_port, s_proto = x.s_proto };
}
var s = ptr.ToStructure<SERVENTx32>();
return new SERVENT { s_name = s.s_name, s_aliases = s.s_aliases.ToStringEnum(s.s_aliases.GetNulledPtrArrayLength(), CharSet.Ansi).ToArray(), s_port = s.s_port, s_proto = s.s_proto };
}
SizeT IVanaraMarshaler.GetNativeSize() => IntPtr.Size == 8 ? Marshal.SizeOf(typeof(SERVENTx64)) : Marshal.SizeOf(typeof(SERVENT));
SafeAllocatedMemoryHandle IVanaraMarshaler.MarshalManagedToNative(object managedObject)
{
if (managedObject is SERVENT s)
{
var mem = new SafeHGlobalHandle(64);
using (var str = new NativeMemoryStream(mem, 64L))
{
str.WriteReference(s.s_name);
str.WriteReferenceObject(s.s_aliases);
if (IntPtr.Size == 8)
{
str.WriteReference(s.s_proto);
str.Write((int)s.s_port);
}
else
{
str.WriteReference(s.s_proto);
str.Write((int)s.s_port);
}
}
return mem;
}
throw new ArgumentException("Object must be of type SERVENT.", nameof(managedObject));
}
object IVanaraMarshaler.MarshalNativeToManaged(IntPtr pNativeData, SizeT allocatedBytes) => FromIntPtr(pNativeData);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct SERVENTx32
{
public StrPtrAnsi s_name;
public IntPtr s_aliases;
public short s_port;
public StrPtrAnsi s_proto;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private struct SERVENTx64
{
public StrPtrAnsi s_name;
public IntPtr s_aliases;
public StrPtrAnsi s_proto;
public short s_port;
}
}
}
}