通常,服务器应用程序设计为侦听来自多个客户端的连接。 对于高性能服务器,通常使用多个线程来处理多个客户端连接。
使用 Winsock 有多种不同的编程技术可用于侦听多个客户端连接。 一种编程技术是创建一个连续循环,该循环使用
侦听
函数检查连接请求, (看到
套接字上的侦听
) 。 如果发生连接请求,应用程序将调用
accept
、
AcceptEx
或
WSAAccept
函数,并将工作传递给另一个线程来处理请求。 可以采用其他几种编程技术。
请注意,此基本示例非常简单,不使用多个线程。 该示例还仅侦听并仅接受单个连接。
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;
接受客户端连接后,服务器应用程序通常会将接受的客户端套接字 (上述示例代码中的 ClientSocket 变量) 工作线程或 I/O 完成端口,并继续接受其他连接。 在此基本示例中,服务器将继续执行下一步。
有多种其他编程技术可用于侦听和接受多个连接。 这包括使用
select
或
WSAPoll
函数。 Microsoft Windows软件开发 (工具包) 随附的高级
Winsock 示例
演示了其中一些各种编程技术的示例。
在 Unix 系统上,服务器的常见编程技术是让应用程序侦听连接。 接受连接后,父进程将调用
分支
函数以创建新的子进程来处理客户端连接,从父级继承套接字。 Windows不支持此编程技术,因为不支持
分支
函数。 此方法通常不适合高性能服务器,因为创建新进程所需的资源比线程所需的资源要大得多。