función bind (winsock2.h)
El enlazar función asocia una dirección local a un socket.
Sintaxis
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
Parámetros
[in] s
Descriptor que identifica un socket sin enlazar.
[in] name
Puntero a un sockaddr estructura de la dirección local que se va a asignar al socket enlazado.
[in] namelen
Longitud, en bytes, del valor al que apunta el nombre parámetro.
Valor devuelto
Si no se produce ningún error, enlazar devuelve cero. De lo contrario, devuelve SOCKET_ERROR y se puede recuperar un código de error específico llamando a WSAGetLastError.
Código de error | Significado |
---|---|
Nota Debe producirse una llamada correcta WSAStartup antes de usar esta función.
|
|
Error en el subsistema de red. | |
Se intentó acceder a un socket de forma prohibida por sus permisos de acceso.
Este error se devuelve si no se pudo enlazar un socket de datagrama a la dirección de difusión porque la opción setockopt de SO_BROADCAST no está habilitada. |
|
Normalmente solo se permite un uso de cada dirección de socket (protocolo, dirección de red/puerto).
Este error se devuelve si un proceso del equipo ya está enlazado a la misma dirección completa y el socket no se ha marcado para permitir la reutilización de direcciones con SO_REUSEADDR. Por ejemplo, la dirección IP y el puerto especificados en el nombre parámetro ya están enlazados a otro socket que usa otra aplicación. Para obtener más información, consulte la opción de socket SO_REUSEADDR en la referencia opciones de socket de |
|
La dirección solicitada no es válida en su contexto.
Este error se devuelve si la dirección especificada a la que apunta el nombre parámetro no es una dirección IP local válida en este equipo. |
|
El sistema detectó una dirección de puntero no válida al intentar usar un argumento de puntero en una llamada.
Este error se devuelve si el nombre de parámetro es NULL, el parámetro nombre o namelen no es una parte válida del espacio de direcciones de usuario, el parámetro namelen es demasiado pequeño, el parámetro nombre contiene un formato de dirección incorrecto para la familia de direcciones asociada o los dos primeros bytes del bloque de memoria especificado por nombre no coinciden con la familia de direcciones asociada. con el descriptor de socket s. |
|
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. | |
Se proporcionó un argumento no válido.
Este error se devuelve del socket s ya está enlazado a una dirección. |
|
No se pudo realizar una operación en un socket porque el sistema no tenía suficiente espacio en búfer o porque una cola estaba llena.
Este error se devuelve de no hay suficientes búferes disponibles o hay demasiadas conexiones. |
|
Se intentó realizar una operación en algo que no es un socket.
Este error se devuelve si el descriptor del parámetro s no es un socket. |
Observaciones
La función de enlace
Cuando se crea un socket con una llamada a la función socket, existe en un espacio de nombres (familia de direcciones), pero no tiene ningún nombre asignado. Use el enlace función para establecer la asociación local del socket mediante la asignación de un nombre local a un socket sin nombre.
Un nombre consta de tres partes al usar la familia de direcciones de Internet:
- Familia de direcciones.
- Una dirección de host.
- Número de puerto que identifica la aplicación.
En Windows Sockets 2, el nombre de
Si una aplicación no le importa qué dirección local se asigna, especifique el valor constante INADDR_ANY para una dirección local IPv4 o el valor constante in6addr_any para una dirección local IPv6 en el miembro sa_data del nombre parámetro. Esto permite al proveedor de servicios subyacente usar cualquier dirección de red adecuada, lo que puede simplificar la programación de aplicaciones en presencia de hosts de hospedados múltiples (es decir, hosts que tienen más de una interfaz de red y dirección).
Para TCP/IP, si el puerto se especifica como cero, el proveedor de servicios asigna un puerto único a la aplicación desde el intervalo de puertos de cliente dinámico. En Windows Vista y versiones posteriores, el intervalo de puertos de cliente dinámico es un valor entre 49152 y 65535. Se trata de un cambio de Windows Server 2003 y versiones anteriores en los que el intervalo de puertos de cliente dinámico era un valor entre 1025 y 5000. El valor máximo para el intervalo de puertos dinámicos de cliente se puede cambiar estableciendo un valor en la siguiente clave del Registro:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
El valor de MaxUserPort registro establece el valor que se va a usar para el valor máximo del intervalo de puertos de cliente dinámico. Debe reiniciar el equipo para que esta configuración surta efecto.
En Windows Vista y versiones posteriores, el intervalo de puertos de cliente dinámico se puede ver y cambiar mediante comandos de netsh. El intervalo de puertos de cliente dinámico se puede establecer de forma diferente para UDP y TCP y también para IPv4 e IPv6. Para obtener más información, consulte KB 929851.
La aplicación puede usar getsockname después de llamar a enlazar para obtener información sobre la dirección y el puerto que se ha asignado al socket. Si la dirección de Internet es igual a INADDR_ANY o in6addr_any, getsockname no puede proporcionar necesariamente la dirección hasta que el socket esté conectado, ya que varias direcciones pueden ser válidas si el host está hospedado múltiple. No se recomienda enlazar a un número de puerto específico distinto del puerto 0 para las aplicaciones cliente, ya que existe un peligro de conflicto con otro socket que ya usa ese número de puerto en el equipo local.
Para las operaciones de multidifusión, el método preferido es llamar a la enlazar función para asociar un socket a una dirección IP local y, a continuación, unir el grupo de multidifusión. Aunque este orden de operaciones no es obligatorio, se recomienda encarecidamente. Por lo tanto, una aplicación de multidifusión seleccionaría primero una dirección IPv4 o IPv6 en el equipo local, la dirección IPv4 con caracteres comodín (INADDR_ANY) o la dirección IPv6 comodín (in6addr_any). A continuación, la aplicación de multidifusión llamaría a la función enlazar con esta dirección en el miembro del sa_data del nombre de parámetro para asociar la dirección IP local con el socket. Si se especificó una dirección comodín, Windows seleccionará la dirección IP local que se va a usar. Una vez completada la enlace función, una aplicación se uniría al grupo de multidifusión de interés. Para obtener más información sobre cómo unirse a un grupo de multidifusión, consulte la sección sobre programación de multidifusión. A continuación, este socket se puede usar para recibir paquetes de multidifusión del grupo de multidifusión mediante elde
La función enlazar no suele ser necesaria para enviar operaciones a un grupo de multidifusión. El sendto,WSASendMsgy WSASendTo funciones enlazan implícitamente el socket a la dirección comodín si el socket aún no está enlazado. La función enlazar es necesaria antes de usar la enviar o funciones WSASend que no realizan un enlace implícito y solo se permiten en sockets conectados, lo que significa que el socket ya debe estar enlazado para que esté conectado. La función enlazar puede usarse antes de enviar operaciones mediante el sendto,WSASendMsgo funciones WSASendTo si una aplicación quería seleccionar una dirección IP local específica en un equipo local con varias interfaces de red y direcciones IP locales. De lo contrario, un enlace implícito a la dirección comodín mediante el sendto,WSASendMsg o funciones de WSASendTo podría dar lugar a que se use una dirección IP local diferente para las operaciones de envío.
notas de para sockets IrDA
- El archivo de encabezado Af_irda.h debe incluirse explícitamente.
- Los nombres locales no se exponen en IrDA. Por lo tanto, los sockets de cliente irDA nunca deben llamar a la función enlazar antes de que la función conectar. Si el socket irDA se ha enlazado previamente a un nombre de servicio mediante
enlace , se producirá un error en la función de conexióncon SOCKET_ERROR. - Si el nombre del servicio tiene el formato "LSAP-SELxxx", donde xxx es un entero decimal en el intervalo 1-127, la dirección indica un LSAP-SEL xxx específico en lugar de un nombre de servicio. Los nombres de servicio como estos permiten que las aplicaciones de servidor acepten conexiones entrantes dirigidas a un LSAP-SEL específico, sin realizar primero una consulta de nombre de servicio ISA para obtener el LSAP-SEL asociado. Un ejemplo de este tipo de nombre de servicio es un dispositivo que no es windows que no admite IAS.
Windows Phone 8: Esta función es compatible con las aplicaciones de la Tienda de Windows Phone en Windows Phone 8 y versiones posteriores.
windows 8.1 y Windows Server 2012 R2: esta función es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.
Ejemplos
En el ejemplo siguiente se muestra el uso de la función enlazar. Para obtener otro ejemplo que usa la función de enlace de
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
// Declare some variables
WSADATA wsaData;
int iResult = 0; // used to return function results
// the listening socket to be created
SOCKET ListenSocket = INVALID_SOCKET;
// The socket address to be passed to bind
sockaddr_in service;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
//----------------------
// Create a SOCKET for listening for
// incoming connection requests
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
//----------------------
// Bind the socket.
iResult = bind(ListenSocket, (SOCKADDR *) &service, sizeof (service));
if (iResult == SOCKET_ERROR) {
wprintf(L"bind failed with error %u\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
else
wprintf(L"bind returned success\n");
WSACleanup();
return 0;
}
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP] |
servidor mínimo admitido | Windows Server 2003 [aplicaciones de escritorio | Aplicaciones para UWP] |
de la plataforma de destino de |
Windows |
encabezado de |
winsock2.h (incluya Winsock2.h) |
biblioteca de |
Ws2_32.lib |
DLL de |
Ws2_32.dll |
Consulte también
opciones de socket de
Uso de SO_REUSEADDR y SO_EXCLUSIVEADDRUSE
de socket de