接受连接(Windows 套接字 2)

一旦套接字正在侦听连接,程序必须处理该套接字上的连接请求。

接受套接字上的连接

  1. 创建名为 ClientSocket 的临时 SOCKET 对象以接受来自客户端的连接。

    
    SOCKET ClientSocket;
    
    
    
  2. 通常,服务器应用程序旨在侦听来自多个客户端的连接。 对于高性能服务器,通常使用多个线程来处理多个客户端连接。

    有几种不同的编程技术使用 Winsock,可用于侦听多个客户端连接。 一种编程技术是创建一个连续循环,该循环使用 listen 函数检查连接请求(请参阅 在套接字上侦听)。 如果发生连接请求,应用程序将调用 接受AcceptExWSAAccept 函数,并将工作传递给另一个线程来处理请求。 其他几种编程技术是可能的。

    请注意,此基本示例非常简单,不使用多个线程。 该示例还仅侦听和接受单个连接。

    
    ClientSocket = INVALID_SOCKET;
    
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    
    
  3. 接受客户端连接后,服务器应用程序通常会将接受的客户端套接字(上述示例代码中的 ClientSocket 变量)传递到工作线程或 I/O 完成端口,并继续接受其他连接。 在此基本示例中,服务器将继续执行下一步。

    有许多其他编程技术可用于侦听和接受多个连接。 这包括使用 selectWSAPoll 函数。 在 Microsoft Windows 软件开发工具包(SDK)随附的 高级 Winsock 示例 中说明了这些各种编程技术实例的一些例子。

    注意

    在 Unix 系统上,服务器的常见编程技术是让应用程序侦听连接。 接受连接后,父进程将调用 分支 函数,以创建新的子进程来处理客户端连接,从而从父级继承套接字。 Windows 不支持此编程技术,因为不支持 分支 函数。 此方法通常也不适合高性能服务器,因为创建新进程所需的资源比线程所需的资源要大得多。

调用 接受 函数后,此示例不再需要 ListenSocket。 调用 closesocket 函数来关闭套接字。

    // No longer need server socket
    closesocket(ListenSocket);

下一步:在服务器接收和发送数据

Winsock入门指南

Winsock Server 应用程序

在套接字上侦听