listen函数
listen
函数用于使服务器套接字进入监听状态,以等待客户端的连接请求。下面是对 listen
函数的简要讲解:
int listen(SOCKET s, int backlog);
s
: 要监听的套接字描述符,通常是通过socket
和bind
创建的服务器套接字。backlog
: 定义了服务器套接字可以排队等待的连接请求数目。这个参数告诉操作系统在连接队列中最多可以容纳多少个等待处理的连接。如果队列已满,新的连接请求将会被拒绝。
返回值:如果返回值为 0,则表示函数调用成功。如果返回值为 SOCKET_ERROR
,则表示发生了错误。在发生错误时,你可以通过调用 WSAGetLastError()
函数获取具体的错误代码。
成功调用 listen
后,服务器套接字就进入了监听状态,等待客户端的连接。这时,你可以使用 accept
函数来接受客户端的连接请求。通常在调用 listen
之后,会有一个循环,不断地调用 accept
来处理客户端连接。
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
printf("Listen failed with error: %ld\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}
在上述代码片段中,SOMAXCONN
是一个常量,表示系统允许的最大连接数。这里是告诉操作系统可以排队等待的最大连接请求数。你也可以根据实际需求传递其他适当的值。
如果 listen
函数调用失败,就会输出错误信息并进行一些清理操作,然后返回一个表示错误的值。
accept函数
accept
函数在服务器端等待客户端的连接请求。当客户端连接请求到达时,accept
函数会创建一个新的套接字,并返回一个新的套接字描述符,该描述符与客户端的套接字建立连接。
函数原型
int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);
参数说明
-
socket
:服务器创建的监听套接字,用于接受客户端的连接请求。 -
address
:一个指向struct sockaddr
的指针,用于存储客户端的地址信息。可以设置为NULL
,表示不关心客户端的地址信息。 -
address_len
:一个指向socklen_t
类型的指针,表示address
缓冲区的长度。当address
不为NULL
时,address_len
需要设置为sizeof(struct sockaddr)
。
返回值
-
如果连接成功,返回一个新的套接字描述符,用于与客户端通信。
-
如果失败,返回
-1
,并设置errno
来指示错误的类型。