Поделиться через


функция 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.

Код ошибки Значение
WSANOTINITIALISED
Примечание. Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup .
 
WSAENETDOWN
Сбой сетевой подсистемы.
WSAEACCES
Предпринята попытка получить доступ к сокету путем, запрещенному его разрешениями на доступ.

Эта ошибка возвращается, если попытка привязать сокет диаграммы к адресу вещания завершилась ошибкой, так как параметр setsockopt SO_BROADCAST не включен.

WSAEADDRINUSE
Обычно разрешено только одно использование каждого адреса сокета (протокол/ сетевой адрес или порт).

Эта ошибка возвращается, если процесс на компьютере уже привязан к тому же полному адресу, и сокет не помечен, чтобы разрешить повторное использование адресов с SO_REUSEADDR. Например, IP-адрес и порт, указанные в параметре имени , уже привязаны к другому сокету, используемому другим приложением. Дополнительные сведения см. в параметре сокета SO_REUSEADDR в справочнике по параметрам сокета SOL_SOCKET, использование SO_REUSEADDR и SO_EXCLUSIVEADDRUSEи SO_EXCLUSIVEADDRUSE.

WSAEADDRNOTAVAIL
Запрошенный адрес недопустим в его контексте.

Эта ошибка возвращается, если указанный адрес, на который указывает имя параметр, не является допустимым локальным IP-адресом на этом компьютере.

WSAEFAULT
Система обнаружила недопустимый адрес указателя при попытке использовать аргумент указателя в вызове.

Эта ошибка возвращается, если параметр имени имеет значение NULL, Параметр имени или namelen не является допустимой частью адресного пространства пользователя, параметр namelen слишком мал, параметр name содержит неправильный формат адреса для связанного семейства адресов, или первые два байта блока памяти, указанного имени не совпадают со связанным семейством адресов. с дескриптором сокета .

WSAEINPROGRESS
Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEINVAL
Указан недопустимый аргумент.

Эта ошибка возвращается сокета уже привязаны к адресу.

WSAENOBUFS
Не удалось выполнить операцию сокета, так как в системе недостаточно буферного пространства или из-за того, что очередь была заполнена.

Эта ошибка возвращается из недостаточного количества буферов или слишком много подключений.

WSAENOTSOCK
Операция была предпринята на то, что не является сокетом.

Эта ошибка возвращается, если дескриптор в параметре не является сокетом.

Замечания

Функция привязки требуется для несвязанного сокета перед последующими вызовами функции прослушивания. Обычно он используется для привязки к сокетам, ориентированным на подключение (поток) или без подключения (диаграмма данных). Функцию привязки также можно использовать для привязки к необработанным сокету (он был создан путем вызова функции сокета с параметром типа, заданным для SOCK_RAW). Функцию привязки можно также использовать в несоединяемом сокете перед последующими вызовамиподключения, ConnectEx, WSAConnect, WSAConnectByListили функции WSAConnectByName перед отправкой операций.

При создании сокета с вызовом функции сокета он существует в пространстве имен (семействе адресов), но у него нет имени. Используйте функцию привязки, чтобы установить локальную связь сокета, назначив локальное имя неназванным сокету.

Имя состоит из трех частей при использовании семейства адресов Интернета:

  • Семейство адресов.
  • Адрес узла.
  • Номер порта, определяющий приложение.

В Сокетах 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 . Диапазон динамических клиентских портов можно задать по-разному для UDP и TCP, а также для IPv4 и IPv6. Дополнительные сведения см. в статье КБ 929851.

Приложение может использовать получает имя-имя после вызова привязки для изучения адреса и порта, назначенного сокету. Если интернет-адрес равен INADDR_ANY или in6addr_any, возвращает имя_адреса не может обязательно указать адрес до подключения сокета, так как несколько адресов могут быть допустимыми, если узел имеет многодомный доступ. Привязка к определенному номеру порта, отличному от порта 0, не рекомендуется для клиентских приложений, так как существует опасность конфликта с другим сокетом, уже использующим этот номер порта на локальном компьютере.

Примечание При использовании привязки с параметром сокета SO_EXCLUSIVEADDRUSE или SO_REUSEADDR необходимо задать параметр сокета перед выполнением привязки привязки, чтобы иметь какое-либо влияние. Дополнительные сведения см. в разделе SO_EXCLUSIVEADDRUSE и использование SO_REUSEADDR и SO_EXCLUSIVEADDRUSE.

 

Для многоадресных операций предпочтительный метод — вызвать функцию привязки связать сокет с локальным IP-адресом, а затем присоединиться к группе многоадресной рассылки. Хотя этот порядок операций не является обязательным, настоятельно рекомендуется. Таким образом, приложение многоадресной рассылки сначала выберет адрес IPv4 или IPv6 на локальном компьютере, подстановочный знак IPv4-адрес (INADDR_ANY), или подстановочный IPv6-адрес (in6addr_any). Затем приложение многоадресной рассылки вызовет функцию привязки с этим адресом в элементе sa_data имени , чтобы связать локальный IP-адрес со сокетом. Если был указан подстановочный адрес, Windows выберет локальный IP-адрес для использования. После завершения функции привязки приложение присоединится к группе многоадресной рассылки. Дополнительные сведения о присоединении к группе многоадресной рассылки см. в разделе о многоадресном программировании. Затем этот сокет можно использовать для получения пакетов многоадресной рассылки из группы многоадресной рассылки с помощью, recvfrom, WSARecv, WSARecvEx, WSARecvFromили LPFN_WSARECVMSG (WSARecvMsg) функций.

Функция привязки привязки обычно не требуется для операций отправки в группу многоадресной рассылки. sendto,WSASendMsgи функции WSASendTo неявно привязывают сокет к подстановочному адресу, если сокет еще не привязан. Функция привязки требуется перед использованием отправки или функций WSASend, которые не выполняют неявную привязку и разрешены только в подключенных сокетах, что означает, что сокет должен быть уже привязан для подключения. Функцию привязки можно использовать перед отправкой операций с помощью sendto,WSASendMsgили функции WSASendTo, если приложение хотело выбрать определенный локальный IP-адрес на локальном компьютере с несколькими сетевыми интерфейсами и локальными IP-адресами. В противном случае неявная привязка к подстановочному адресу с помощьюsendto ,WSASendMsg или функции WSASendTo могут привести к использованию другого локального IP-адреса для операций отправки.

Примечание При выполнении блокирующего вызова Winsock, например привязки, Winsock может потребоваться ждать сетевого события до завершения вызова. Winsock выполняет оповещенное ожидание в этой ситуации, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в одном потоке. Выдача другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке приведет к неопределенному поведению и никогда не должен пытаться клиентами Winsock.
 

заметки для сокетов 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 и более поздних версий.

Примеры

В следующем примере показано использование функции привязки . Другой пример, использующий функцию привязки , см. в разделе Начало работы с Winsock.

#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_EXCLUSIVEADDRUSE

необработанные сокеты TCP/IP

использование SO_REUSEADDR и SO_EXCLUSIVEADDRUSE

WSACancelBlockingCall

Функции Winsock

Справочник Winsock

подключение

возвращает имя

прослушивание

setsockopt

sockaddr

сокета