функция bind (winsock2.h)
Функция привязки
Синтаксис
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
Параметры
[in] s
Дескриптор, определяющий несвязанный сокет.
[in] name
Указатель на структуру sockaddr локального адреса, назначаемого связанному сокету.
[in] namelen
Длина значения в байтах, указываемого параметром имени
Возвращаемое значение
Если ошибка не возникает, привязка возвращает ноль. В противном случае возвращается SOCKET_ERROR, а определенный код ошибки можно получить путем вызова WSAGetLastError.
Код ошибки | Значение |
---|---|
|
|
Сбой сетевой подсистемы. | |
Предпринята попытка получить доступ к сокету путем, запрещенному его разрешениями на доступ.
Эта ошибка возвращается, если попытка привязать сокет диаграммы к адресу вещания завершилась ошибкой, так как параметр |
|
Обычно разрешено только одно использование каждого адреса сокета (протокол/ сетевой адрес или порт).
Эта ошибка возвращается, если процесс на компьютере уже привязан к тому же полному адресу, и сокет не помечен, чтобы разрешить повторное использование адресов с SO_REUSEADDR. Например, IP-адрес и порт, указанные в параметре имени |
|
Запрошенный адрес недопустим в его контексте.
Эта ошибка возвращается, если указанный адрес, на который указывает имя параметр, не является допустимым локальным IP-адресом на этом компьютере. |
|
Система обнаружила недопустимый адрес указателя при попытке использовать аргумент указателя в вызове.
Эта ошибка возвращается, если параметр имени |
|
Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Указан недопустимый аргумент.
Эта ошибка возвращается сокета |
|
Не удалось выполнить операцию сокета, так как в системе недостаточно буферного пространства или из-за того, что очередь была заполнена.
Эта ошибка возвращается из недостаточного количества буферов или слишком много подключений. |
|
Операция была предпринята на то, что не является сокетом.
Эта ошибка возвращается, если дескриптор в параметре |
Замечания
Функция привязки
При создании сокета с вызовом функции сокета
Имя состоит из трех частей при использовании семейства адресов Интернета:
- Семейство адресов.
- Адрес узла.
- Номер порта, определяющий приложение.
В Сокетах Windows 2 параметр имени не интерпретируется как указатель на структуру sockaddr. Это приводится таким образом для совместимости сокетов Windows 1.1. Поставщики услуг могут рассматривать его как указатель на блок памяти размера namelen. Первые 2 байта в этом блоке (соответствующие элементу sa_family структуры sockaddr, элементу sin_family структуры sockaddr_in или члену sin6_family структуры sockaddr_in6) должен содержать семейство адресов, которое использовалось для создания сокета. В противном случае возникает ошибка WSAEFAULT.
Если приложение не заботится о том, какой локальный адрес назначен, укажите константное значение INADDR_ANY для локального адреса IPv4 или константного значения in6addr_any для локально го адреса IPv6 в элементе sa_data имени параметра. Это позволяет базовому поставщику услуг использовать любой соответствующий сетевой адрес, что потенциально упрощает программирование приложений в присутствии многодомных узлов (то есть узлов с несколькими сетевыми интерфейсами и адресами).
Для TCP/IP, если порт указан как нулевой, поставщик служб назначает уникальный порт приложению из диапазона динамических клиентских портов. В Windows Vista и более поздних версиях диапазон динамических клиентских портов — это значение от 49152 до 65535. Это изменение от Windows Server 2003 и более ранних версий, когда диапазон динамических клиентских портов был значением от 1025 до 5000. Максимальное значение для диапазона динамических портов клиента можно изменить, задав значение в следующем разделе реестра:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Значение реестра MaxUserPort задает значение, используемое для максимального значения динамического диапазона портов клиента. Чтобы этот параметр вступил в силу, необходимо перезапустить компьютер.
В Windows Vista и более поздних версиях диапазон динамических клиентских портов можно просматривать и изменять с помощью команд netsh
Приложение может использовать получает имя-имя после вызова привязки для изучения адреса и порта, назначенного сокету. Если интернет-адрес равен INADDR_ANY или in6addr_any, возвращает имя_адреса не может обязательно указать адрес до подключения сокета, так как несколько адресов могут быть допустимыми, если узел имеет многодомный доступ. Привязка к определенному номеру порта, отличному от порта 0, не рекомендуется для клиентских приложений, так как существует опасность конфликта с другим сокетом, уже использующим этот номер порта на локальном компьютере.
Для многоадресных операций предпочтительный метод — вызвать функцию привязки связать сокет с локальным IP-адресом, а затем присоединиться к группе многоадресной рассылки. Хотя этот порядок операций не является обязательным, настоятельно рекомендуется. Таким образом, приложение многоадресной рассылки сначала выберет адрес IPv4 или IPv6 на локальном компьютере, подстановочный знак IPv4-адрес (INADDR_ANY), или подстановочный IPv6-адрес (in6addr_any). Затем приложение многоадресной рассылки вызовет функцию привязки с этим адресом в элементе sa_data имени , чтобы связать локальный IP-адрес со сокетом. Если был указан подстановочный адрес, Windows выберет локальный IP-адрес для использования. После завершения функции привязки
Функция привязки привязки обычно не требуется для операций отправки в группу многоадресной рассылки.
sendto,WSASendMsgи функции WSASendTo неявно привязывают сокет к подстановочному адресу, если сокет еще не привязан. Функция привязки требуется перед использованием отправки или функций WSASend, которые не выполняют неявную привязку и разрешены только в подключенных сокетах, что означает, что сокет должен быть уже привязан для подключения. Функцию привязки можно использовать перед отправкой операций с помощью sendto,WSASendMsgили функции WSASendTo, если приложение хотело выбрать определенный локальный IP-адрес на локальном компьютере с несколькими сетевыми интерфейсами и локальными IP-адресами. В противном случае неявная привязка к подстановочному адресу с помощьюsendto
заметки для сокетов IrDA
- Файл заголовка Af_irda.h должен быть явно включен.
- Локальные имена не предоставляются в IrDA. Поэтому клиентские сокеты IrDA никогда не должны вызывать функцию привязки перед подключением функции. Если сокет IrDA ранее привязан к имени службы с помощью привязки, функция подключения завершится ошибкой SOCKET_ERROR.
- Если имя службы имеет форму LSAP-SELxxxx, где xxx — десятичное целое число в диапазоне 1–127, адрес указывает конкретный LSAP-SEL xxx, а не имя службы. Такие имена служб позволяют серверным приложениям принимать входящие подключения, направленные на определенный LSAP-SEL, не выполняя запрос имени службы ISA, чтобы получить связанный LSAP-SEL. Одним из примеров этого типа имени службы является устройство, отличное от Windows, которое не поддерживает IAS.
Windows Phone 8: эта функция поддерживается для приложений Магазина Windows Phone в Windows Phone 8 и более поздних версиях.
Windows 8.1 и Windows Server 2012 R2: эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Примеры
В следующем примере показано использование функции привязки
#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;
}
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
минимальный поддерживаемый сервер | Windows Server 2003 [классические приложения | Приложения UWP] |
целевая платформа | Виндоус |
заголовка | winsock2.h (include Winsock2.h) |
библиотеки |
Ws2_32.lib |
DLL | Ws2_32.dll |
См. также
многоадресное программирование
Параметры сокета SOL_SOCKET
использование SO_REUSEADDR и SO_EXCLUSIVEADDRUSE
Справочник
подключение
сокета