标识绑定的未连接套接字的描述符。
[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 入门。
必须显式包含 Af_irda.h 头文件。
积压工作参数 (以无提示方式) 基础服务提供商确定的合理值。 非法值被最接近的法律值所取代。 没有标准预配来找出实际的积压工作值。
Windows Phone 8:Windows Phone 8 及更高版本上Windows Phone应用商店应用支持此函数。
Windows 8.1和Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。