From a4da14984317788466372899165ddf8195b71dc5 Mon Sep 17 00:00:00 2001 From: dahall Date: Wed, 25 Mar 2020 17:39:16 -0600 Subject: [PATCH] Added socket method overload to take uint as protocol. --- PInvoke/Ws2_32/WinSock2.legacy.cs | 377 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) diff --git a/PInvoke/Ws2_32/WinSock2.legacy.cs b/PInvoke/Ws2_32/WinSock2.legacy.cs index 5203409b..576f40f6 100644 --- a/PInvoke/Ws2_32/WinSock2.legacy.cs +++ b/PInvoke/Ws2_32/WinSock2.legacy.cs @@ -4346,6 +4346,383 @@ namespace Vanara.PInvoke [PInvokeData("winsock2.h", MSDNShortId = "6bf6e6c4-6268-479c-86a6-52e90cf317db")] public static extern SafeSOCKET socket(ADDRESS_FAMILY af, SOCK type, IPPROTO protocol); + /// The socket function creates a socket that is bound to a specific transport service provider. + /// + /// The address family specification. Possible values for the address family are defined in the Winsock2.h header file. + /// + /// 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. + /// + /// + /// 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, AF_INET and PF_INET), so either constant can be used. + /// + /// The table below lists common values for address family although many other values are possible. + /// + /// + /// Af + /// Meaning + /// + /// + /// AF_UNSPEC 0 + /// The address family is unspecified. + /// + /// + /// AF_INET 2 + /// The Internet Protocol version 4 (IPv4) address family. + /// + /// + /// AF_IPX 6 + /// + /// 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. + /// + /// + /// + /// AF_APPLETALK 16 + /// + /// 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. + /// + /// + /// + /// AF_NETBIOS 17 + /// + /// 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. + /// + /// + /// + /// AF_INET6 23 + /// The Internet Protocol version 6 (IPv6) address family. + /// + /// + /// AF_IRDA 26 + /// + /// The Infrared Data Association (IrDA) address family. This address family is only supported if the computer has an infrared port + /// and driver installed. + /// + /// + /// + /// AF_BTH 32 + /// + /// 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. + /// + /// + /// + /// + /// + /// The type specification for the new socket. + /// Possible values for the socket type are defined in the Winsock2.h header file. + /// The following table lists the possible values for the type parameter supported for Windows Sockets 2: + /// + /// + /// Type + /// Meaning + /// + /// + /// SOCK_STREAM 1 + /// + /// 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). + /// + /// + /// + /// SOCK_DGRAM 2 + /// + /// 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). + /// + /// + /// + /// SOCK_RAW 3 + /// + /// 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. + /// + /// + /// + /// SOCK_RDM 4 + /// + /// 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. + /// + /// + /// + /// SOCK_SEQPACKET 5 + /// A socket type that provides a pseudo-stream packet based on datagrams. + /// + /// + /// + /// 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. + /// + /// In Windows Sockets 1.1, the only possible socket types are SOCK_DGRAM and SOCK_STREAM. + /// + /// + /// + /// 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. + /// + /// + /// 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 IPPROTO 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. + /// + /// + /// 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. + /// + /// + /// When the af parameter is AF_INET or AF_INET6 and the type is SOCK_RAW, the value specified for the protocol is set in the + /// protocol field of the IPv6 or IPv4 packet header. + /// + /// The table below lists common values for the protocol although many other values are possible. + /// + /// + /// protocol + /// Meaning + /// + /// + /// IPPROTO_ICMP 1 + /// + /// 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. + /// + /// + /// + /// IPPROTO_IGMP 2 + /// + /// 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. + /// + /// + /// + /// BTHPROTO_RFCOMM 3 + /// + /// 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. + /// + /// + /// + /// IPPROTO_TCP 6 + /// + /// 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. + /// + /// + /// + /// IPPROTO_UDP 17 + /// + /// 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. + /// + /// + /// + /// IPPROTO_ICMPV6 58 + /// + /// 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. + /// + /// + /// + /// IPPROTO_RM 113 + /// + /// 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. + /// + /// + /// + /// + /// + /// + /// If no error occurs, socket 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. + /// + /// + /// + /// Error code + /// Meaning + /// + /// + /// WSANOTINITIALISED + /// A successful WSAStartup call must occur before using this function. + /// + /// + /// WSAENETDOWN + /// The network subsystem or the associated service provider has failed. + /// + /// + /// WSAEAFNOSUPPORT + /// + /// 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. + /// + /// + /// + /// WSAEINPROGRESS + /// A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function. + /// + /// + /// WSAEMFILE + /// No more socket descriptors are available. + /// + /// + /// WSAEINVAL + /// + /// 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. + /// + /// + /// + /// WSAEINVALIDPROVIDER + /// The service provider returned a version other than 2.2. + /// + /// + /// WSAEINVALIDPROCTABLE + /// The service provider returned an invalid or incomplete procedure table to the WSPStartup. + /// + /// + /// WSAENOBUFS + /// No buffer space is available. The socket cannot be created. + /// + /// + /// WSAEPROTONOSUPPORT + /// The specified protocol is not supported. + /// + /// + /// WSAEPROTOTYPE + /// The specified protocol is the wrong type for this socket. + /// + /// + /// WSAEPROVIDERFAILEDINIT + /// + /// 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. + /// + /// + /// + /// WSAESOCKTNOSUPPORT + /// The specified socket type is not supported in this address family. + /// + /// + /// + /// + /// + /// The socket 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. + /// + /// + /// 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 NULL. + /// + /// + /// 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. + /// + /// + /// Note The manifest constant AF_UNSPEC 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. + /// + /// + /// Applications are encouraged to use AF_INET6 for the af parameter and create a dual-mode socket that can be used with both + /// IPv4 and IPv6. + /// + /// + /// Connection-oriented sockets such as SOCK_STREAM 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. + /// + /// + /// 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. + /// + /// + /// 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. + /// + /// + /// IPv6 and IPv4 operate differently when receiving a socket with a type of SOCK_RAW. 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. + /// + /// Note On Windows NT, raw socket support requires administrative privileges. + /// + /// A socket with a type parameter of SOCK_SEQPACKET 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 SOCK_SEQPACKET. + /// + /// + /// When the af parameter is AF_NETBIOS for NetBIOS over TCP/IP, the type parameter can be SOCK_DGRAM or + /// SOCK_SEQPACKET. For the AF_NETBIOS address family, the protocol parameter is the LAN adapter number represented as + /// a negative number. + /// + /// + /// 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. + /// + /// netsh winsock show catalog + /// + /// Support for sockets with type SOCK_RAW is not required, but service providers are encouraged to support raw sockets as practicable. + /// + /// Notes for IrDA Sockets + /// Keep the following in mind: + /// + /// + /// The Af_irda.h header file must be explicitly included. + /// + /// + /// Only SOCK_STREAM is supported; the SOCK_DGRAM type is not supported by IrDA. + /// + /// + /// The protocol parameter is always set to 0 for IrDA. + /// + /// + /// + /// 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 socket function with af parameter set to AF_IRDA will fail and WSAGetLastError + /// returns WSAEPROTONOSUPPORT. + /// + /// Example Code + /// + /// The following example demonstrates the use of the socket function to create a socket that is bound to a specific + /// transport service provider.. + /// + /// Windows Phone 8: This function is supported for Windows Phone Store apps on Windows Phone 8 and later. + /// + /// Windows 8.1 and Windows Server 2012 R2: This function is supported for Windows Store apps on Windows 8.1, Windows + /// Server 2012 R2, and later. + /// + /// + // 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); + /// /// The protoent 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