Compartir a través de


Función WSASocketA (winsock2.h)

La función WSASocket crea un socket enlazado a un proveedor de servicios de transporte específico.

Sintaxis

SOCKET WSAAPI WSASocketA(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOA lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

Parámetros

[in] af

Especificación de la familia de direcciones. Los valores posibles para la familia de direcciones se definen en el archivo de encabezado Winsock2.h .

En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de los archivos de encabezado ha cambiado y los valores posibles para la familia de direcciones se definen en el archivo de encabezado Ws2def.h. Tenga en cuenta que el archivo de encabezado Ws2def.h se incluye automáticamente en Winsock2.h y nunca se debe usar directamente.

Los valores admitidos actualmente son AF_INET o AF_INET6, que son los formatos de familia de direcciones de Internet para IPv4 e IPv6. Se admiten otras opciones para la familia de direcciones (AF_NETBIOS para su uso con NetBIOS, por ejemplo) si se instala un proveedor de servicios de Windows Sockets para la familia de direcciones. Tenga en cuenta que los valores de la familia de direcciones AF_ y las constantes de familia de protocolos PF_ son idénticas (por ejemplo, AF_INET y PF_INET), por lo que se puede usar cualquiera de las constantes.

En la tabla siguiente se enumeran los valores comunes de la familia de direcciones, aunque muchos otros valores son posibles.

Af Significado
AF_UNSPEC
0
No se especifica la familia de direcciones.
AF_INET
2
Familia de direcciones del Protocolo de Internet versión 4 (IPv4).
AF_IPX
6
Familia de direcciones IPX/SPX. Esta familia de direcciones solo se admite si está instalado el protocolo de transporte compatible con NWLink IPX/SPX NetBIOS.

Esta familia de direcciones no se admite en Windows Vista y versiones posteriores.

AF_APPLETALK
16
Familia de direcciones de AppleTalk. Esta familia de direcciones solo se admite si está instalado el protocolo AppleTalk.

Esta familia de direcciones no se admite en Windows Vista y versiones posteriores.

AF_NETBIOS
17
Familia de direcciones NetBIOS. Esta familia de direcciones solo se admite si está instalado el proveedor de Windows Sockets para NetBIOS.

El proveedor de Windows Sockets para NetBIOS es compatible con versiones de 32 bits de Windows. Este proveedor se instala de forma predeterminada en versiones de 32 bits de Windows.

El proveedor de Windows Sockets para NetBIOS no se admite en versiones de 64 bits de windows, como Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 o Windows XP.

El proveedor de Windows Sockets para NetBIOS solo admite sockets en los que el parámetro de tipo se establece en SOCK_DGRAM.

El proveedor de Windows Sockets para NetBIOS no está relacionado directamente con la interfaz de programación netBIOS . La interfaz de programación NetBIOS no se admite en Windows Vista, Windows Server 2008 y versiones posteriores.

AF_INET6
23
Familia de direcciones del Protocolo de Internet versión 6 (IPv6).
AF_IRDA
26
Familia de direcciones de la Asociación de datos infrarrojos (IrDA).

Esta familia de direcciones solo se admite si el equipo tiene instalado un puerto infrarrojo y un controlador.

AF_BTH
32
La familia de direcciones Bluetooth.

Esta familia de direcciones es compatible con Windows XP con SP2 o posterior si el equipo tiene instalado un adaptador y un controlador Bluetooth.

[in] type

Especificación de tipo para el nuevo socket.

Los valores posibles para el tipo de socket se definen en el archivo de encabezado Winsock2.h .

En la tabla siguiente se enumeran los valores posibles para el parámetro de tipo admitido para Windows Sockets 2:

Tipo Significado
SOCK_STREAM
1
Tipo de socket que proporciona flujos de bytes secuenciados, confiables, bidireccionales y basados en conexiones con un mecanismo de transmisión de datos OOB. Este tipo de socket usa el Protocolo de control de transmisión (TCP) para la familia de direcciones de Internet (AF_INET o AF_INET6).
SOCK_DGRAM
2
Tipo de socket que admite datagramas, que son a menos que los búferes no confiables de una longitud máxima fija (normalmente pequeña). Este tipo de socket usa el Protocolo de datagramas de usuario (UDP) para la familia de direcciones de Internet (AF_INET o AF_INET6).
SOCK_RAW
3
Tipo de socket que proporciona un socket sin formato que permite a una aplicación manipular el siguiente encabezado de protocolo de capa superior. Para manipular el encabezado IPv4, la opción de socket IP_HDRINCL debe establecerse en el socket. Para manipular el encabezado IPv6, la opción de socket IPV6_HDRINCL debe establecerse en el socket.
SOCK_RDM
4
Tipo de socket que proporciona un datagrama de mensaje confiable. Un ejemplo de este tipo es la implementación del protocolo de multidifusión general pragmática (PGM) en Windows, a menudo denominada programación de multidifusión confiable.

Este valor de tipo solo se admite si está instalado el Protocolo de multidifusión confiable.

SOCK_SEQPACKET
5
Tipo de socket que proporciona un paquete pseudo-stream basado en datagramas.
 

En Windows Sockets 2, se introdujeron nuevos tipos de socket. Una aplicación puede detectar dinámicamente los atributos de cada protocolo de transporte disponible a través de la función WSAEnumProtocols . Por lo tanto, una aplicación puede determinar las posibles opciones de tipo de socket y protocolo para una familia de direcciones y usar esta información al especificar este parámetro. Las definiciones de tipo de socket en los archivos de encabezado Winsock2.h y Ws2def.h se actualizarán periódicamente a medida que se definen nuevos tipos de socket, familias de direcciones y protocolos.

En Windows Sockets 1.1, los únicos tipos de socket posibles son SOCK_DGRAM y SOCK_STREAM.

[in] protocol

Protocolo que se va a usar. Las opciones posibles para el parámetro de protocolo son específicas de la familia de direcciones y el tipo de socket especificados. Los valores posibles para el protocolo se definen en los archivos de encabezado Winsock2.h y Wsrm.h .

En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de los archivos de encabezado ha cambiado y este parámetro puede ser uno de los valores del tipo de enumeración IPPROTO definido en el archivo de encabezado Ws2def.h. Tenga en cuenta que el archivo de encabezado Ws2def.h se incluye automáticamente en Winsock2.h y nunca se debe usar directamente.

Si se especifica un valor de 0, el autor de la llamada no desea especificar un protocolo y el proveedor de servicios elegirá el protocolo que se va a usar.

Cuando el parámetro af se AF_INET o AF_INET6 y el tipo se SOCK_RAW, el valor especificado para el protocolo se establece en el campo de protocolo del encabezado de paquete IPv6 o IPv4.

En la tabla siguiente se enumeran los valores comunes para el protocolo , aunque muchos otros valores son posibles.

protocol Significado
IPPROTO_ICMP
1
Protocolo de mensajes de control de Internet (ICMP). Se trata de un valor posible cuando el parámetro af es AF_UNSPEC, AF_INET o AF_INET6 y el parámetro de tipo se SOCK_RAW o no se especifica.

Este valor de protocolo se admite en Windows XP y versiones posteriores.

IPPROTO_IGMP
2
Protocolo de administración de grupos de Internet (IGMP). Se trata de un valor posible cuando el parámetro af es AF_UNSPEC, AF_INET o AF_INET6 y el parámetro de tipo se SOCK_RAW o no se especifica.

Este valor de protocolo se admite en Windows XP y versiones posteriores.

BTHPROTO_RFCOMM
3
El protocolo Bluetooth Radio Frequency Communications (Bluetooth RFCOMM). Se trata de un valor posible cuando el parámetro af se AF_BTH y el parámetro de tipo se SOCK_STREAM.

Este valor de protocolo se admite en Windows XP con SP2 o posterior.

IPPROTO_TCP
6
Protocolo de control de transmisión (TCP). Se trata de un valor posible cuando el parámetro af es AF_INET o AF_INET6 y el parámetro de tipo es SOCK_STREAM.
IPPROTO_UDP
17
Protocolo de datagramas de usuario (UDP). Se trata de un valor posible cuando el parámetro af es AF_INET o AF_INET6 y el parámetro de tipo es SOCK_DGRAM.
IPPROTO_ICMPV6
58
Protocolo de mensajes de control de Internet versión 6 (ICMPv6). Se trata de un valor posible cuando el parámetro af es AF_UNSPEC, AF_INET o AF_INET6 y el parámetro de tipo se SOCK_RAW o no se especifica.

Este valor de protocolo se admite en Windows XP y versiones posteriores.

IPPROTO_RM
113
Protocolo PGM para multidifusión confiable. Se trata de un valor posible cuando el parámetro af se AF_INET y el parámetro de tipo se SOCK_RDM. En el Windows SDK publicado para Windows Vista y versiones posteriores, este protocolo también se denomina IPPROTO_PGM.

Este valor de protocolo solo se admite si está instalado el protocolo de multidifusión confiable.

[in] lpProtocolInfo

Puntero a una estructura de WSAPROTOCOL_INFO que define las características del socket que se va a crear. Si este parámetro no es NULL, el socket se enlazará al proveedor asociado a la estructura de WSAPROTOCOL_INFO indicada.

[in] g

Un identificador de grupo de sockets existente o una acción adecuada que se debe realizar al crear un nuevo socket y un nuevo grupo de sockets.

Si g es un identificador de grupo de sockets existente, una el nuevo socket a este grupo de sockets, siempre que se cumplan todos los requisitos establecidos por este grupo.

Si g no es un identificador de grupo de sockets existente, se pueden realizar los siguientes valores.

e Significado
0
No se realiza ninguna operación de grupo.
SG_UNCONSTRAINED_GROUP
0x01
Cree un grupo de sockets sin restricciones y haga que el nuevo socket sea el primer miembro. En el caso de un grupo sin restricciones, Winsock no restringe todos los sockets del grupo de sockets para que se hayan creado con el mismo valor para los parámetros de tipo y protocolo .
SG_CONSTRAINED_GROUP
0x02
Cree un grupo de sockets restringidos y haga que el nuevo socket sea el primer miembro. En el caso de un grupo de sockets restringido, Winsock restringe todos los sockets del grupo de sockets para que se hayan creado con el mismo valor para los parámetros de tipo y protocolo . Un grupo de sockets restringidos solo puede constar de sockets orientados a la conexión y requiere que las conexiones de todos los sockets agrupados estén en la misma dirección en el mismo host.
 
Nota Las constantes SG_UNCONSTRAINED_GROUP y SG_CONSTRAINED_GROUP no se definen actualmente en un archivo de encabezado público.
 

[in] dwFlags

Conjunto de marcas usadas para especificar atributos de socket adicionales.

Se puede establecer una combinación de estas marcas, aunque no se permiten algunas combinaciones.

Valor Significado
WSA_FLAG_OVERLAPPED
0x01
Cree un socket que admita operaciones de E/S superpuestas.

La mayoría de los sockets se deben crear con este conjunto de marcas. Los sockets superpuestos pueden usar WSASend, WSASendTo, WSARecv, WSARecvFrom y WSAIoctl para operaciones de E/S superpuestas, que permiten iniciar y en curso varias operaciones simultáneamente.

Todas las funciones que permiten la operación superpuesta (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl) también admiten el uso no superpuesto en un socket superpuesto si los valores de los parámetros relacionados con las operaciones superpuestas son NULL.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
Cree un socket que será un c_root en una sesión de varios puntos.

Este atributo solo se permite si la estructura de WSAPROTOCOL_INFO para el proveedor de transporte que crea el socket admite un mecanismo de multipunto o multidifusión y el plano de control de una sesión de varios puntos está raíz. Esto se indicaría mediante el miembro dwServiceFlags1 de la estructura de WSAPROTOCOL_INFO con las marcas XP1_SUPPORT_MULTIPOINT y XP1_MULTIPOINT_CONTROL_PLANE establecidas.

Cuando el parámetro lpProtocolInfo no es NULL, el parámetro lpProtocolInfo señala la estructura WSAPROTOCOL_INFO para el proveedor de transporte. Cuando el parámetro lpProtocolInfo es NULL, la estructura de WSAPROTOCOL_INFO se basa en el proveedor de transporte seleccionado por los valores especificados para los parámetros af, type y protocol .

Consulte Semántica de multipunto y multidifusión para obtener información adicional sobre una sesión de varios puntos.

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
Cree un socket que será un c_leaf en una sesión de varios puntos.

Este atributo solo se permite si la estructura de WSAPROTOCOL_INFO para el proveedor de transporte que crea el socket admite un mecanismo de multipunto o multidifusión y el plano de control de una sesión de varios puntos no tiene raíz. Esto se indicaría mediante el miembro dwServiceFlags1 de la estructura WSAPROTOCOL_INFO con la marca XP1_SUPPORT_MULTIPOINT establecida y la marca XP1_MULTIPOINT_CONTROL_PLANE no establecida.

Cuando el parámetro lpProtocolInfo no es NULL, el parámetro lpProtocolInfo señala la estructura WSAPROTOCOL_INFO para el proveedor de transporte. Cuando el parámetro lpProtocolInfo es NULL, la estructura de WSAPROTOCOL_INFO se basa en el proveedor de transporte seleccionado por los valores especificados para los parámetros af, type y protocol .

Consulte Semántica de multipunto y multidifusión para obtener información adicional sobre una sesión de varios puntos.

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
Cree un socket que será un d_root en una sesión de varios puntos.

Este atributo solo se permite si la estructura de WSAPROTOCOL_INFO para el proveedor de transporte que crea el socket admite un mecanismo de multipunto o multidifusión y el plano de datos de una sesión de varios puntos está raíz. Esto se indicaría mediante el miembro dwServiceFlags1 de la estructura de WSAPROTOCOL_INFO con las marcas XP1_SUPPORT_MULTIPOINT y XP1_MULTIPOINT_DATA_PLANE establecidas.

Cuando el parámetro lpProtocolInfo no es NULL, el parámetro lpProtocolInfo señala la estructura WSAPROTOCOL_INFO para el proveedor de transporte. Cuando el parámetro lpProtocolInfo es NULL, la estructura de WSAPROTOCOL_INFO se basa en el proveedor de transporte seleccionado por los valores especificados para los parámetros af, type y protocol .

Consulte Semántica de multipunto y multidifusión para obtener información adicional sobre una sesión de varios puntos.

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
Cree un socket que será un d_leaf en una sesión de varios puntos.

Este atributo solo se permite si la estructura de WSAPROTOCOL_INFO para el proveedor de transporte que crea el socket admite un mecanismo de multipunto o multidifusión y el plano de datos de una sesión de varios puntos no tiene raíz. Esto se indicaría mediante el miembro dwServiceFlags1 de la estructura WSAPROTOCOL_INFO con la marca XP1_SUPPORT_MULTIPOINT establecida y la marca XP1_MULTIPOINT_DATA_PLANE no establecida.

Cuando el parámetro lpProtocolInfo no es NULL, el parámetro lpProtocolInfo señala la estructura WSAPROTOCOL_INFO para el proveedor de transporte. Cuando el parámetro lpProtocolInfo es NULL, la estructura de WSAPROTOCOL_INFO se basa en el proveedor de transporte seleccionado por los valores especificados para los parámetros af, type y protocol .

Consulte Semántica de multipunto y multidifusión para obtener información adicional sobre una sesión de varios puntos.

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
Cree un socket que permita establecer un descriptor de seguridad en el socket que contiene una lista de control de acceso de seguridad (SACL) en lugar de una lista de control de acceso discrecional (DACL).

Las SACL se usan para generar auditorías y alarmas cuando se produce una comprobación de acceso en el objeto. Para un socket, se produce una comprobación de acceso para determinar si se debe permitir que el socket se enlace a una dirección específica especificada para la función de enlace .

El ACCESS_SYSTEM_SECURITY derecho de acceso controla la capacidad de obtener o establecer la SACL en el descriptor de seguridad de un objeto. El sistema concede este derecho de acceso solo si el privilegio SE_SECURITY_NAME está habilitado en el token de acceso del subproceso solicitante.

WSA_FLAG_NO_HANDLE_INHERIT
0x80
Cree un socket que no se pueda heredar.

Un identificador de socket creado por WSASocket o la función de socket se puede heredar de forma predeterminada. Cuando se establece esta marca, el identificador de socket no se puede heredar.

La función GetHandleInformation se puede usar para determinar si se creó un identificador de socket con el conjunto de marcas de WSA_FLAG_NO_HANDLE_INHERIT . La función GetHandleInformation devolverá que se establece el valor de HANDLE_FLAG_INHERIT .

Esta marca se admite en Windows 7 con SP1, Windows Server 2008 R2 con SP1 y versiones posteriores.

 
Importante En el caso de los sockets de varios puntos, solo se puede especificar una de las marcas de WSA_FLAG_MULTIPOINT_C_ROOT o WSA_FLAG_MULTIPOINT_C_LEAF y solo se puede especificar una de las marcas de WSA_FLAG_MULTIPOINT_D_ROOT o WSA_FLAG_MULTIPOINT_D_LEAF . Consulte Semántica de multipunto y multidifusión para obtener información adicional.
 

Valor devuelto

Si no se produce ningún error, WSASocket devuelve un descriptor que hace referencia al nuevo socket. De lo contrario, se devuelve un valor de INVALID_SOCKET y se puede recuperar un código de error específico llamando a WSAGetLastError.

Nota Esta descripción del código de error es específica de Microsoft.
 
Código de error Significado
WSANOTINITIALISED
Debe producirse una llamada de WSAStartup correcta antes de usar esta función.
WSAENETDOWN
Error en el subsistema de red.
WSAEAFNOSUPPORT
La familia de direcciones especificada no se admite.
WSAEFAULT
El parámetro lpProtocolInfo no está en una parte válida del espacio de direcciones del proceso.
WSAEINPROGRESS
Una llamada de Bloqueo de Windows Sockets 1.1 está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAEINVAL
Este valor es true para cualquiera de las condiciones siguientes.
  • El parámetro g especificado no es válido.
  • La estructura de WSAPROTOCOL_INFO a la que apunta lpProtocolInfo está incompleta, el contenido no es válido o la estructura de WSAPROTOCOL_INFO ya se ha usado en una operación de socket duplicado anterior.
  • Los valores especificados para los miembros del socket triple <af, tipo y protocolo> se admiten individualmente, pero la combinación especificada no lo es.
WSAEINVALIDPROVIDER
El proveedor de servicios devolvió una versión distinta de la 2.2.
WSAEINVALIDPROCTABLE
El proveedor de servicios devolvió una tabla de procedimientos no válida o incompleta al WSPStartup.
WSAEMFILE
No hay más descriptores de socket disponibles.
WSAENOBUFS
No hay espacio disponible en el búfer. El socket no se puede crear.
WSAEPROTONOSUPPORT
No se admite el protocolo especificado.
WSAEPROTOTYPE
El protocolo especificado es el tipo incorrecto para este socket.
WSAEPROVIDERFAILEDINIT
El proveedor de servicios no se pudo inicializar. Este error se devuelve si un proveedor de servicios en capas (LSP) o un proveedor de espacios de nombres se instaló incorrectamente o el proveedor no funciona correctamente.
WSAESOCKTNOSUPPORT
El tipo de socket especificado no se admite en esta familia de direcciones.

Comentarios

La función WSASocket hace que se asigne un descriptor de socket y cualquier recurso relacionado y asociado a un proveedor de servicios de transporte. La mayoría de los sockets se deben crear con el atributo WSA_FLAG_OVERLAPPED establecido en el parámetro dwFlags . Un socket creado con este atributo admite el uso de operaciones de E/S superpuestas que proporcionan un mayor rendimiento. De forma predeterminada, un socket creado con la función WSASocket no tendrá establecido este atributo superpuesto. En cambio, la función de socket crea un socket que admite operaciones de E/S superpuestas como comportamiento predeterminado.

Si el parámetro lpProtocolInfo es NULL, Winsock utilizará el primer proveedor de servicios de transporte disponible que admita la combinación solicitada de familia de direcciones, tipo de socket y protocolo especificados en los parámetros af, type y protocol .

Si el parámetro lpProtocolInfo no es NULL, el socket se enlazará al proveedor asociado a la estructura de WSAPROTOCOL_INFO indicada. En este caso, la aplicación puede proporcionar la constante de manifiesto FROM_PROTOCOL_INFO como valor para cualquiera de los parámetros af, type o protocol . Esto indica que se van a asumir los valores correspondientes de la estructura de WSAPROTOCOL_INFO indicada (iAddressFamily, iSocketType, iProtocol). En cualquier caso, los valores especificados para af, type y protocol se pasan sin modificar al proveedor de servicios de transporte.

Al seleccionar un protocolo y su proveedor de servicios auxiliar basado en af, type y protocol, este procedimiento solo elegirá un protocolo base o una cadena de protocolos, no una capa de protocolo por sí misma. Las capas de protocolo no encadenadas no se consideran coincidencias parciales en el tipo o af, ya sea. Es decir, no conducen a un código de error de WSAEAFNOSUPPORT o WSAEPROTONOSUPPORT, si no se encuentra ningún protocolo adecuado.

Nota La constante de manifiesto AF_UNSPEC continúa definida en el archivo de encabezado, pero su uso es muy desaconsejado, ya que esto puede provocar ambigüedad al interpretar el valor del parámetro de protocolo .
 
Se recomienda que las aplicaciones usen AF_INET6 para el parámetro af y creen un socket de doble modo que se pueda usar con IPv4 e IPv6.

Si se crea un socket mediante la función WSASocket , el parámetro dwFlags debe tener establecido el atributo WSA_FLAG_OVERLAPPED para que las opciones de socket SO_RCVTIMEO o SO_SNDTIMEO funcionen correctamente. De lo contrario, el tiempo de espera nunca surte efecto en el socket.

Los sockets orientados a la conexión, como SOCK_STREAM proporcionan conexiones dúplex completas, y deben estar en un estado conectado antes de que se puedan enviar o recibir datos en ellos. Se establece una conexión a un socket especificado con una llamada de función connect o WSAConnect . Una vez conectado, los datos se pueden transferir mediante el envío/ de llamadasWSASend y recv/WSARecv. Una vez completada una sesión, se debe llamar a la función closesocket para liberar los recursos asociados al socket. En el caso de los sockets orientados a la conexión, se debe llamar a la función shutdown para detener la transferencia de datos en el socket antes de llamar a la función closesocket .

Los protocolos de comunicaciones utilizados para implementar un socket confiable orientado a la conexión garantizan que los datos no se pierdan o dupliquen. Si los datos para los que el protocolo del mismo nivel tiene espacio en búfer no se pueden transmitir correctamente dentro de un período de tiempo razonable, la conexión se considera interrumpida y las llamadas posteriores producirán un error con el código de error establecido en WSAETIMEDOUT.

Los sockets orientados a mensajes sin conexión permiten el envío y recepción de datagramas hacia y desde pares arbitrarios mediante sendto/WSASendTo y recvfrom/WSARecvFrom. Si este socket está conectado a un par específico, los datagramas se pueden enviar a ese mismo nivel mediante el envío/ deWSASend y se pueden recibir desde (solo) este par mediante recv/WSARecv.

No se requiere compatibilidad con sockets con tipo SOCK_RAW , pero se recomienda a los proveedores de servicios que admitan sockets sin procesar siempre que sea posible.

La función WSASocket se puede usar para crear un socket que usará un servicio para que, si otro socket intenta enlazar al mismo puerto utilizado por el servicio, se genera un registro de auditoría. Para habilitar esta opción, una aplicación tendría que hacer lo siguiente:

  • Llame a la función AdjustTokenPrivileges para habilitar el privilegio SE_SECURITY_NAME en el token de acceso para el proceso. Este privilegio es necesario para establecer los derechos de acceso ACCESS_SYSTEM_SECURITY en el descriptor de seguridad de un objeto.
  • Llame a la función WSASocket para crear un socket con dwFlag con la opción WSA_FLAG_ACCESS_SYSTEM_SECURITY establecida. Se producirá un error en la función WSASocket si no se llama primero a la función AdjustTokenPrivileges para habilitar el privilegio SE_SECURITY_NAME necesario para esta operación.
  • Llame a la función SetSecurityInfo para establecer un descriptor de seguridad con un System Access Control List (SACL) en el socket. El identificador de socket devuelto por la función WSASocket se pasa en el parámetro handle . Si la función se ejecuta correctamente, se establecerá el ACCESS_SYSTEM_SECURITY derecho de acceso en el descriptor de seguridad del socket.
  • Llame a la función bind para enlazar el socket a un puerto específico. Si la función de enlace se realiza correctamente, se genera una entrada de auditoría si otro socket intenta enlazar al mismo puerto.
  • Llame a la función AdjustTokenPrivileges para quitar el privilegio SE_SECURITY_NAME en el token de acceso del proceso, ya que ya no es necesario.

Para obtener más información sobre ACCESS_SYSTEM_SECURITY, consulte Derecho de acceso SACL y Generación de auditorías en la documentación de autorización.

Grupos de sockets

WinSock 2 introdujo la noción de un grupo de sockets como medio para una aplicación, o conjunto de cooperación de aplicaciones, para indicar a un proveedor de servicios subyacente que un conjunto determinado de sockets están relacionados y que el grupo formado por lo tanto tiene ciertos atributos. Los atributos de grupo incluyen prioridades relativas de los sockets individuales dentro del grupo y una calidad de grupo de la especificación del servicio.

Las aplicaciones que necesitan intercambiar secuencias multimedia a través de la red son un ejemplo en el que poder establecer una relación específica entre un conjunto de sockets podría ser beneficioso. Depende del transporte sobre cómo tratar los grupos de sockets.

Las funciones WSASocket y WSAAccept se pueden usar para crear y unir explícitamente un grupo de sockets al crear un nuevo socket. El identificador de grupo de sockets de un socket se puede recuperar mediante la función getockopt con el parámetro level establecido en SOL_SOCKET y el parámetro optname establecido en SO_GROUP_ID. Un grupo de sockets y su identificador de grupo de sockets asociado permanecen válidos hasta que se cierre el último socket que pertenece a este grupo de sockets. Los identificadores de grupo de sockets son únicos en todos los procesos de un proveedor de servicios determinado. Un grupo de sockets de cero indica que el socket no es miembro de un grupo de sockets.

Se puede acceder a la prioridad de grupo relativa de un grupo de sockets mediante la función getockopt con el parámetro level establecido en SOL_SOCKET y el parámetro optname establecido en SO_GROUP_PRIORITY. La prioridad de grupo relativa de un grupo de sockets se puede establecer mediante setsockopt con el parámetro level establecido en SOL_SOCKET y el parámetro optname establecido en SO_GROUP_PRIORITY.

El proveedor winsock incluido con Windows permite la creación de grupos de sockets y aplica el SG_CONSTRAINED_GROUP. Todos los sockets de un grupo de sockets restringidos deben crearse con el mismo valor para los parámetros de tipo y protocolo . Un grupo de sockets restringidos solo puede constar de sockets orientados a la conexión y requiere que las conexiones de todos los sockets agrupados sean la misma dirección en el mismo host. Esta es la única restricción aplicada a un grupo de sockets por el proveedor winsock incluido con Windows. El proveedor winsock no usa actualmente la prioridad del grupo de sockets ni la pila TCP/IP incluida con Windows.

Código de ejemplo

En el ejemplo siguiente se muestra el uso de la función WSASocket .
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8: la función WSASocketW es compatible con las aplicaciones de Windows Phone Store en Windows Phone 8 y versiones posteriores.

Windows 8.1 y Windows Server 2012 R2: la función WSASocketW es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.

Nota

El encabezado winsock2.h define WSASocket como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado winsock2.h
Library Ws2_32.lib
Archivo DLL Ws2_32.dll

Consulte también

WSAPROTOCOL_INFO

Funciones winsock

Referencia de Winsock

accept

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

recv

recvfrom

select

enviar

sendto

setsockopt

shutdown

socket