相关文章推荐
无聊的日记本  ·  alltypes - ...·  10 月前    · 
没有腹肌的弓箭  ·  android file delete ...·  1 年前    · 
追风的烤土司  ·  delphi - Does ...·  1 年前    · 

标识绑定的未连接套接字的描述符。

[in] backlog

挂起连接队列的最大长度。 如果设置为 SOMAXCONN ,则 负责套接字的基础 服务提供商会将积压工作设置为最大合理值。 如果设置为 SOMAXCONN_HINT (N) ((其中 N 为数字) ),积压工作值将为 N,调整为 (介于 200、65535) 范围内。 请注意, SOMAXCONN_HINT 可用于将积压工作设置为大于 SOMAXCONN 的值。

SOMAXCONN_HINT 仅受 Microsoft TCP/IP 服务提供商支持。 没有用于获取实际积压工作值的标准预配。

如果未发生错误, 侦听 将返回零。 否则,返回 SOCKET_ERROR 值,可以通过调用 WSAGetLastError 来检索特定的错误代码。

若要接受连接,首先使用套接字函数创建 套接字 ,并使用 绑定 函数绑定到本地地址。 使用 侦听 指定传入连接的积压工作,然后使用 accept 函数接受连接。 面向连接的套接字(例如,类型 为 SOCK_STREAM 的套接字)用于 侦听 套接字进入 被动模式,进程确认传入连接请求并排队等待接受。

SOMAXCONN 积压 的值是一个特殊的常量,指示 负责套接字的基础 服务提供商将挂起连接队列的长度设置为最大合理值。

在 Windows 套接字 2 上,此最大值默认为大值, (通常为数百个或多个) 。

在蓝牙应用程序中调用 侦听 函数时,强烈建议将低得多的值用于 积压工作 参数 (通常为 2 到 4) ,因为只接受少数客户端连接。 这减少了分配供侦听套接字使用的系统资源。 此相同建议适用于仅需要几个客户端连接的其他网络应用程序。

侦听 函数通常由一次可以有多个连接请求的服务器使用。 如果连接请求到达且队列已满,则客户端将收到一个错误,指示 WSAECONNREFUSED

如果没有可用的套接字描述符, 则侦听 尝试继续正常运行。 如果描述符可用,稍后调用 侦听 接受 会将队列重新填充到为 积压工作 参数指定的当前或最新值(如果可能),并恢复侦听传入连接。

如果在已侦听套接字上调用 侦听 函数,它将返回成功,而不会更改 积压工作 参数的值。 在后续调用中将 积压工作 参数设置为 0,以 侦听 套接字时,不被视为适当的重置,尤其是在套接字上存在连接时。

注意 发出阻止 Winsock 调用(例如 侦听 )时,Winsock 可能需要等待网络事件,然后才能完成调用。 Winsock 在此情况下执行可警报等待,这可以通过异步过程调用中断, (APC) 在同一线程上计划。 在 APC 内发出另一个阻止 Winsock 调用,中断同一线程上正在进行的阻止 Winsock 调用将导致未定义的行为,并且永远不会由 Winsock 客户端尝试。
以下示例演示 了侦听 函数的使用。
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
int wmain()
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = 0;
    SOCKET ListenSocket = INVALID_SOCKET;
    sockaddr_in service;
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup() failed with error: %d\n", iResult);
        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: %ld\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);
    iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind function failed with error %d\n", WSAGetLastError());
        iResult = closesocket(ListenSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    //----------------------
    // Listen for incoming connection requests 
    // on the created socket
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
        wprintf(L"listen function failed with error: %d\n", WSAGetLastError());
    wprintf(L"Listening on socket...\n");
    iResult = closesocket(ListenSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    WSACleanup();
    return 0;
有关使用侦听函数的另一个示例,请参阅与 Winsock 入门

IrDA 套接字说明

  • 必须显式包含 Af_irda.h 头文件。
  • 积压工作参数 (以无提示方式) 基础服务提供商确定的合理值。 非法值被最接近的法律值所取代。 没有标准预配来找出实际的积压工作值。

    Windows Phone 8:Windows Phone 8 及更高版本上Windows Phone应用商店应用支持此函数。

    Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。